﻿(function (q) {
    if ("object" == typeof exports && "object" == typeof module)module.exports = q(); else {
        if ("function" == typeof define && define.amd)return define([], q);
        this.CodeMirror = q()
    }
})(function () {
    function q(a, b) {
        if (!(this instanceof q))return new q(a, b);
        this.options = b = b ? V(b) : {};
        V(qf, b, !1);
        wc(b);
        var c = b.value;
        "string" == typeof c && (c = new P(c, b.mode));
        this.doc = c;
        var d = new q.inputStyles[b.inputStyle](this), d = this.display = new rf(a, c, d);
        d.wrapper.CodeMirror = this;
        Ad(this);
        Bd(this);
        b.lineWrapping && (this.display.wrapper.className +=
            " CodeMirror-wrap");
        b.autofocus && !ab && d.input.focus();
        Cd(this);
        this.state = {
            keyMaps: [],
            overlays: [],
            modeGen: 0,
            overwrite: !1,
            delayingBlurEvent: !1,
            focused: !1,
            suppressEdits: !1,
            pasteIncoming: !1,
            cutIncoming: !1,
            draggingText: !1,
            highlight: new bb,
            keySeq: null,
            specialChars: null
        };
        var e = this;
        B && 11 > C && setTimeout(function () {
            e.display.input.reset(!0)
        }, 20);
        sf(this);
        Dd || (tf(), Dd = !0);
        Ja(this);
        this.curOp.forceUpdate = !0;
        Ed(this, c);
        b.autofocus && !ab || e.hasFocus() ? setTimeout(cb(xc, this), 20) : db(this);
        for (var f in Ka)if (Ka.hasOwnProperty(f))Ka[f](this,
            b[f], Fd);
        Gd(this);
        b.finishInit && b.finishInit(this);
        for (c = 0; c < yc.length; ++c)yc[c](this);
        La(this);
        J && b.lineWrapping && "optimizelegibility" == getComputedStyle(d.lineDiv).textRendering && (d.lineDiv.style.textRendering = "auto")
    }

    function rf(a, b, c) {
        this.input = c;
        this.scrollbarFiller = t("div", null, "CodeMirror-scrollbar-filler");
        this.scrollbarFiller.setAttribute("cm-not-content", "true");
        this.gutterFiller = t("div", null, "CodeMirror-gutter-filler");
        this.gutterFiller.setAttribute("cm-not-content", "true");
        this.lineDiv =
            t("div", null, "CodeMirror-code");
        this.selectionDiv = t("div", null, null, "position: relative; z-index: 1");
        this.cursorDiv = t("div", null, "CodeMirror-cursors");
        this.measure = t("div", null, "CodeMirror-measure");
        this.lineMeasure = t("div", null, "CodeMirror-measure");
        this.lineSpace = t("div", [this.measure, this.lineMeasure, this.selectionDiv, this.cursorDiv, this.lineDiv], null, "position: relative; outline: none");
        this.mover = t("div", [t("div", [this.lineSpace], "CodeMirror-lines")], null, "position: relative");
        this.sizer = t("div",
            [this.mover], "CodeMirror-sizer");
        this.sizerWidth = null;
        this.heightForcer = t("div", null, null, "position: absolute; height: " + Hd + "px; width: 1px;");
        this.gutters = t("div", null, "CodeMirror-gutters");
        this.lineGutter = null;
        this.scroller = t("div", [this.sizer, this.heightForcer, this.gutters], "CodeMirror-scroll");
        this.scroller.setAttribute("tabIndex", "-1");
        this.wrapper = t("div", [this.scrollbarFiller, this.gutterFiller, this.scroller], "CodeMirror");
        B && 8 > C && (this.gutters.style.zIndex = -1, this.scroller.style.paddingRight =
            0);
        J || wa && ab || (this.scroller.draggable = !0);
        a && (a.appendChild ? a.appendChild(this.wrapper) : a(this.wrapper));
        this.reportedViewFrom = this.reportedViewTo = this.viewFrom = this.viewTo = b.first;
        this.view = [];
        this.externalMeasured = this.renderedView = null;
        this.lastWrapHeight = this.lastWrapWidth = this.viewOffset = 0;
        this.updateLineNumbers = null;
        this.nativeBarWidth = this.barHeight = this.barWidth = 0;
        this.scrollbarsClipped = !1;
        this.lineNumWidth = this.lineNumInnerWidth = this.lineNumChars = null;
        this.alignWidgets = !1;
        this.maxLine = this.cachedCharWidth =
            this.cachedTextHeight = this.cachedPaddingH = null;
        this.maxLineLength = 0;
        this.maxLineChanged = !1;
        this.wheelDX = this.wheelDY = this.wheelStartX = this.wheelStartY = null;
        this.shift = !1;
        this.activeTouch = this.selForContextMenu = null;
        c.init(this)
    }

    function zc(a) {
        a.doc.mode = q.getMode(a.options, a.doc.modeOption);
        eb(a)
    }

    function eb(a) {
        a.doc.iter(function (a) {
            a.stateAfter && (a.stateAfter = null);
            a.styles && (a.styles = null)
        });
        a.doc.frontier = a.doc.first;
        fb(a, 100);
        a.state.modeGen++;
        a.curOp && Q(a)
    }

    function Id(a) {
        var b = xa(a.display),
            c = a.options.lineWrapping, d = c && Math.max(5, a.display.scroller.clientWidth / gb(a.display) - 3);
        return function (e) {
            if (ya(a.doc, e))return 0;
            var f = 0;
            if (e.widgets)for (var g = 0; g < e.widgets.length; g++)e.widgets[g].height && (f += e.widgets[g].height);
            return c ? f + (Math.ceil(e.text.length / d) || 1) * b : f + b
        }
    }

    function Ac(a) {
        var b = a.doc, c = Id(a);
        b.iter(function (a) {
            var b = c(a);
            b != a.height && ca(a, b)
        })
    }

    function Bd(a) {
        a.display.wrapper.className = a.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + a.options.theme.replace(/(^|\s)\s*/g,
            " cm-s-");
        hb(a)
    }

    function ib(a) {
        Ad(a);
        Q(a);
        setTimeout(function () {
            Bc(a)
        }, 20)
    }

    function Ad(a) {
        var b = a.display.gutters, c = a.options.gutters;
        za(b);
        for (var d = 0; d < c.length; ++d) {
            var e = c[d], f = b.appendChild(t("div", null, "CodeMirror-gutter " + e));
            "CodeMirror-linenumbers" == e && (a.display.lineGutter = f, f.style.width = (a.display.lineNumWidth || 1) + "px")
        }
        b.style.display = d ? "" : "none";
        Cc(a)
    }

    function Cc(a) {
        a.display.sizer.style.marginLeft = a.display.gutters.offsetWidth + "px"
    }

    function Kb(a) {
        if (0 == a.height)return 0;
        for (var b = a.text.length,
                 c, d = a; c = Aa(d, !0);)c = c.find(0, !0), d = c.from.line, b += c.from.ch - c.to.ch;
        for (d = a; c = Aa(d, !1);)c = c.find(0, !0), b -= d.text.length - c.from.ch, d = c.to.line, b += d.text.length - c.to.ch;
        return b
    }

    function Dc(a) {
        var b = a.display;
        a = a.doc;
        b.maxLine = u(a, a.first);
        b.maxLineLength = Kb(b.maxLine);
        b.maxLineChanged = !0;
        a.iter(function (a) {
            var d = Kb(a);
            d > b.maxLineLength && (b.maxLineLength = d, b.maxLine = a)
        })
    }

    function wc(a) {
        var b = D(a.gutters, "CodeMirror-linenumbers");
        -1 == b && a.lineNumbers ? a.gutters = a.gutters.concat(["CodeMirror-linenumbers"]) :
        -1 < b && !a.lineNumbers && (a.gutters = a.gutters.slice(0), a.gutters.splice(b, 1))
    }

    function jb(a) {
        var b = a.display, c = b.gutters.offsetWidth, d = Math.round(a.doc.height + Ec(a.display));
        return {
            clientHeight: b.scroller.clientHeight,
            viewHeight: b.wrapper.clientHeight,
            scrollWidth: b.scroller.scrollWidth,
            clientWidth: b.scroller.clientWidth,
            viewWidth: b.wrapper.clientWidth,
            barLeft: a.options.fixedGutter ? c : 0,
            docHeight: d,
            scrollHeight: d + da(a) + b.barHeight,
            nativeBarWidth: b.nativeBarWidth,
            gutterWidth: c
        }
    }

    function Fc(a, b, c) {
        this.cm =
            c;
        var d = this.vert = t("div", [t("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"), e = this.horiz = t("div", [t("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
        a(d);
        a(e);
        v(d, "scroll", function () {
            d.clientHeight && b(d.scrollTop, "vertical")
        });
        v(e, "scroll", function () {
            e.clientWidth && b(e.scrollLeft, "horizontal")
        });
        this.checkedOverlay = !1;
        B && 8 > C && (this.horiz.style.minHeight = this.vert.style.minWidth = "18px")
    }

    function Gc() {
    }

    function Cd(a) {
        a.display.scrollbars && (a.display.scrollbars.clear(),
        a.display.scrollbars.addClass && kb(a.display.wrapper, a.display.scrollbars.addClass));
        a.display.scrollbars = new q.scrollbarModel[a.options.scrollbarStyle](function (b) {
            a.display.wrapper.insertBefore(b, a.display.scrollbarFiller);
            v(b, "mousedown", function () {
                a.state.focused && setTimeout(function () {
                    a.display.input.focus()
                }, 0)
            });
            b.setAttribute("cm-not-content", "true")
        }, function (b, c) {
            "horizontal" == c ? Ma(a, b) : lb(a, b)
        }, a);
        a.display.scrollbars.addClass && mb(a.display.wrapper, a.display.scrollbars.addClass)
    }

    function Na(a,
                b) {
        b || (b = jb(a));
        var c = a.display.barWidth, d = a.display.barHeight;
        Jd(a, b);
        for (var e = 0; 4 > e && c != a.display.barWidth || d != a.display.barHeight; e++)c != a.display.barWidth && a.options.lineWrapping && Lb(a), Jd(a, jb(a)), c = a.display.barWidth, d = a.display.barHeight
    }

    function Jd(a, b) {
        var c = a.display, d = c.scrollbars.update(b);
        c.sizer.style.paddingRight = (c.barWidth = d.right) + "px";
        c.sizer.style.paddingBottom = (c.barHeight = d.bottom) + "px";
        d.right && d.bottom ? (c.scrollbarFiller.style.display = "block", c.scrollbarFiller.style.height =
            d.bottom + "px", c.scrollbarFiller.style.width = d.right + "px") : c.scrollbarFiller.style.display = "";
        d.bottom && a.options.coverGutterNextToScrollbar && a.options.fixedGutter ? (c.gutterFiller.style.display = "block", c.gutterFiller.style.height = d.bottom + "px", c.gutterFiller.style.width = b.gutterWidth + "px") : c.gutterFiller.style.display = ""
    }

    function Hc(a, b, c) {
        var d = c && null != c.top ? Math.max(0, c.top) : a.scroller.scrollTop, d = Math.floor(d - a.lineSpace.offsetTop), e = c && null != c.bottom ? c.bottom : d + a.wrapper.clientHeight, d = Ba(b, d),
            e = Ba(b, e);
        if (c && c.ensure) {
            var f = c.ensure.from.line;
            c = c.ensure.to.line;
            f < d ? (d = f, e = Ba(b, ea(u(b, f)) + a.wrapper.clientHeight)) : Math.min(c, b.lastLine()) >= e && (d = Ba(b, ea(u(b, c)) - a.wrapper.clientHeight), e = c)
        }
        return {from: d, to: Math.max(e, d + 1)}
    }

    function Bc(a) {
        var b = a.display, c = b.view;
        if (b.alignWidgets || b.gutters.firstChild && a.options.fixedGutter) {
            for (var d = Ic(b) - b.scroller.scrollLeft + a.doc.scrollLeft, e = b.gutters.offsetWidth, f = d + "px", g = 0; g < c.length; g++)if (!c[g].hidden) {
                a.options.fixedGutter && c[g].gutter && (c[g].gutter.style.left =
                    f);
                var h = c[g].alignable;
                if (h)for (var k = 0; k < h.length; k++)h[k].style.left = f
            }
            a.options.fixedGutter && (b.gutters.style.left = d + e + "px")
        }
    }

    function Gd(a) {
        if (!a.options.lineNumbers)return !1;
        var b = a.doc, b = Jc(a.options, b.first + b.size - 1), c = a.display;
        if (b.length != c.lineNumChars) {
            var d = c.measure.appendChild(t("div", [t("div", b)], "CodeMirror-linenumber CodeMirror-gutter-elt")), e = d.firstChild.offsetWidth, d = d.offsetWidth - e;
            c.lineGutter.style.width = "";
            c.lineNumInnerWidth = Math.max(e, c.lineGutter.offsetWidth - d) + 1;
            c.lineNumWidth =
                c.lineNumInnerWidth + d;
            c.lineNumChars = c.lineNumInnerWidth ? b.length : -1;
            c.lineGutter.style.width = c.lineNumWidth + "px";
            Cc(a);
            return !0
        }
        return !1
    }

    function Jc(a, b) {
        return String(a.lineNumberFormatter(b + a.firstLineNumber))
    }

    function Ic(a) {
        return a.scroller.getBoundingClientRect().left - a.sizer.getBoundingClientRect().left
    }

    function Mb(a, b, c) {
        var d = a.display;
        this.viewport = b;
        this.visible = Hc(d, a.doc, b);
        this.editorIsHidden = !d.wrapper.offsetWidth;
        this.wrapperHeight = d.wrapper.clientHeight;
        this.wrapperWidth = d.wrapper.clientWidth;
        this.oldDisplayWidth = pa(a);
        this.force = c;
        this.dims = Kc(a);
        this.events = []
    }

    function Lc(a, b) {
        var c = a.display, d = a.doc;
        if (b.editorIsHidden)return qa(a), !1;
        if (!b.force && b.visible.from >= c.viewFrom && b.visible.to <= c.viewTo && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo) && c.renderedView == c.view && 0 == Kd(a))return !1;
        Gd(a) && (qa(a), b.dims = Kc(a));
        var e = d.first + d.size, f = Math.max(b.visible.from - a.options.viewportMargin, d.first), g = Math.min(e, b.visible.to + a.options.viewportMargin);
        c.viewFrom < f && 20 > f - c.viewFrom &&
        (f = Math.max(d.first, c.viewFrom));
        c.viewTo > g && 20 > c.viewTo - g && (g = Math.min(e, c.viewTo));
        ra && (f = Mc(a.doc, f), g = Ld(a.doc, g));
        d = f != c.viewFrom || g != c.viewTo || c.lastWrapHeight != b.wrapperHeight || c.lastWrapWidth != b.wrapperWidth;
        e = a.display;
        0 == e.view.length || f >= e.viewTo || g <= e.viewFrom ? (e.view = Nb(a, f, g), e.viewFrom = f) : (e.viewFrom > f ? e.view = Nb(a, f, e.viewFrom).concat(e.view) : e.viewFrom < f && (e.view = e.view.slice(Ca(a, f))), e.viewFrom = f, e.viewTo < g ? e.view = e.view.concat(Nb(a, e.viewTo, g)) : e.viewTo > g && (e.view = e.view.slice(0,
            Ca(a, g))));
        e.viewTo = g;
        c.viewOffset = ea(u(a.doc, c.viewFrom));
        a.display.mover.style.top = c.viewOffset + "px";
        g = Kd(a);
        if (!d && 0 == g && !b.force && c.renderedView == c.view && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo))return !1;
        f = fa();
        4 < g && (c.lineDiv.style.display = "none");
        uf(a, c.updateLineNumbers, b.dims);
        4 < g && (c.lineDiv.style.display = "");
        c.renderedView = c.view;
        f && fa() != f && f.offsetHeight && f.focus();
        za(c.cursorDiv);
        za(c.selectionDiv);
        c.gutters.style.height = 0;
        d && (c.lastWrapHeight = b.wrapperHeight, c.lastWrapWidth =
            b.wrapperWidth, fb(a, 400));
        c.updateLineNumbers = null;
        return !0
    }

    function Md(a, b) {
        for (var c = b.viewport, d = !0; ; d = !1) {
            if (!d || !a.options.lineWrapping || b.oldDisplayWidth == pa(a))if (c && null != c.top && (c = {top: Math.min(a.doc.height + Ec(a.display) - Nc(a), c.top)}), b.visible = Hc(a.display, a.doc, c), b.visible.from >= a.display.viewFrom && b.visible.to <= a.display.viewTo)break;
            if (!Lc(a, b))break;
            Lb(a);
            d = jb(a);
            nb(a);
            Oc(a, d);
            Na(a, d)
        }
        b.signal(a, "update", a);
        if (a.display.viewFrom != a.display.reportedViewFrom || a.display.viewTo != a.display.reportedViewTo)b.signal(a,
            "viewportChange", a, a.display.viewFrom, a.display.viewTo), a.display.reportedViewFrom = a.display.viewFrom, a.display.reportedViewTo = a.display.viewTo
    }

    function Pc(a, b) {
        var c = new Mb(a, b);
        if (Lc(a, c)) {
            Lb(a);
            Md(a, c);
            var d = jb(a);
            nb(a);
            Oc(a, d);
            Na(a, d);
            c.finish()
        }
    }

    function Oc(a, b) {
        a.display.sizer.style.minHeight = b.docHeight + "px";
        var c = b.docHeight + a.display.barHeight;
        a.display.heightForcer.style.top = c + "px";
        a.display.gutters.style.height = Math.max(c + da(a), b.clientHeight) + "px"
    }

    function Lb(a) {
        a = a.display;
        for (var b =
            a.lineDiv.offsetTop, c = 0; c < a.view.length; c++) {
            var d = a.view[c], e;
            if (!d.hidden) {
                if (B && 8 > C) {
                    var f = d.node.offsetTop + d.node.offsetHeight;
                    e = f - b;
                    b = f
                } else e = d.node.getBoundingClientRect(), e = e.bottom - e.top;
                f = d.line.height - e;
                2 > e && (e = xa(a));
                if (.001 < f || -.001 > f)if (ca(d.line, e), Nd(d.line), d.rest)for (e = 0; e < d.rest.length; e++)Nd(d.rest[e])
            }
        }
    }

    function Nd(a) {
        if (a.widgets)for (var b = 0; b < a.widgets.length; ++b)a.widgets[b].height = a.widgets[b].node.offsetHeight
    }

    function Kc(a) {
        for (var b = a.display, c = {}, d = {}, e = b.gutters.clientLeft,
                 f = b.gutters.firstChild, g = 0; f; f = f.nextSibling, ++g)c[a.options.gutters[g]] = f.offsetLeft + f.clientLeft + e, d[a.options.gutters[g]] = f.clientWidth;
        return {
            fixedPos: Ic(b),
            gutterTotalWidth: b.gutters.offsetWidth,
            gutterLeft: c,
            gutterWidth: d,
            wrapperWidth: b.wrapper.clientWidth
        }
    }

    function uf(a, b, c) {
        function d(b) {
            var c = b.nextSibling;
            J && W && a.display.currentWheelTarget == b ? b.style.display = "none" : b.parentNode.removeChild(b);
            return c
        }

        for (var e = a.display, f = a.options.lineNumbers, g = e.lineDiv, h = g.firstChild, k = e.view, e = e.viewFrom,
                 l = 0; l < k.length; l++) {
            var m = k[l];
            if (!m.hidden)if (m.node && m.node.parentNode == g) {
                for (; h != m.node;)h = d(h);
                h = f && null != b && b <= e && m.lineNumber;
                m.changes && (-1 < D(m.changes, "gutter") && (h = !1), Od(a, m, e, c));
                h && (za(m.lineNumber), m.lineNumber.appendChild(document.createTextNode(Jc(a.options, e))));
                h = m.node.nextSibling
            } else {
                var p = vf(a, m, e, c);
                g.insertBefore(p, h)
            }
            e += m.size
        }
        for (; h;)h = d(h)
    }

    function Od(a, b, c, d) {
        for (var e = 0; e < b.changes.length; e++) {
            var f = b.changes[e];
            if ("text" == f) {
                var f = b, g = f.text.className, h = Pd(a, f);
                f.text ==
                f.node && (f.node = h.pre);
                f.text.parentNode.replaceChild(h.pre, f.text);
                f.text = h.pre;
                h.bgClass != f.bgClass || h.textClass != f.textClass ? (f.bgClass = h.bgClass, f.textClass = h.textClass, Qc(f)) : g && (f.text.className = g)
            } else if ("gutter" == f)Qd(a, b, c, d); else if ("class" == f)Qc(b); else if ("widget" == f) {
                f = a;
                g = b;
                h = d;
                g.alignable && (g.alignable = null);
                for (var k = g.node.firstChild, l = void 0; k; k = l)l = k.nextSibling, "CodeMirror-linewidget" == k.className && g.node.removeChild(k);
                Rd(f, g, h)
            }
        }
        b.changes = null
    }

    function Ob(a) {
        a.node == a.text &&
        (a.node = t("div", null, null, "position: relative"), a.text.parentNode && a.text.parentNode.replaceChild(a.node, a.text), a.node.appendChild(a.text), B && 8 > C && (a.node.style.zIndex = 2));
        return a.node
    }

    function Pd(a, b) {
        var c = a.display.externalMeasured;
        return c && c.line == b.line ? (a.display.externalMeasured = null, b.measure = c.measure, c.built) : Sd(a, b)
    }

    function Qc(a) {
        var b = a.bgClass ? a.bgClass + " " + (a.line.bgClass || "") : a.line.bgClass;
        b && (b += " CodeMirror-linebackground");
        if (a.background)b ? a.background.className = b : (a.background.parentNode.removeChild(a.background),
            a.background = null); else if (b) {
            var c = Ob(a);
            a.background = c.insertBefore(t("div", null, b), c.firstChild)
        }
        a.line.wrapClass ? Ob(a).className = a.line.wrapClass : a.node != a.text && (a.node.className = "");
        a.text.className = (a.textClass ? a.textClass + " " + (a.line.textClass || "") : a.line.textClass) || ""
    }

    function Qd(a, b, c, d) {
        b.gutter && (b.node.removeChild(b.gutter), b.gutter = null);
        var e = b.line.gutterMarkers;
        if (a.options.lineNumbers || e) {
            var f = Ob(b), g = b.gutter = t("div", null, "CodeMirror-gutter-wrapper", "left: " + (a.options.fixedGutter ?
                d.fixedPos : -d.gutterTotalWidth) + "px; width: " + d.gutterTotalWidth + "px");
            a.display.input.setUneditable(g);
            f.insertBefore(g, b.text);
            b.line.gutterClass && (g.className += " " + b.line.gutterClass);
            !a.options.lineNumbers || e && e["CodeMirror-linenumbers"] || (b.lineNumber = g.appendChild(t("div", Jc(a.options, c), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + d.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + a.display.lineNumInnerWidth + "px")));
            if (e)for (b = 0; b < a.options.gutters.length; ++b)c = a.options.gutters[b],
            (f = e.hasOwnProperty(c) && e[c]) && g.appendChild(t("div", [f], "CodeMirror-gutter-elt", "left: " + d.gutterLeft[c] + "px; width: " + d.gutterWidth[c] + "px"))
        }
    }

    function vf(a, b, c, d) {
        var e = Pd(a, b);
        b.text = b.node = e.pre;
        e.bgClass && (b.bgClass = e.bgClass);
        e.textClass && (b.textClass = e.textClass);
        Qc(b);
        Qd(a, b, c, d);
        Rd(a, b, d);
        return b.node
    }

    function Rd(a, b, c) {
        Td(a, b.line, b, c, !0);
        if (b.rest)for (var d = 0; d < b.rest.length; d++)Td(a, b.rest[d], b, c, !1)
    }

    function Td(a, b, c, d, e) {
        if (b.widgets) {
            var f = Ob(c), g = 0;
            for (b = b.widgets; g < b.length; ++g) {
                var h =
                    b[g], k = t("div", [h.node], "CodeMirror-linewidget");
                h.handleMouseEvents || k.setAttribute("cm-ignore-events", "true");
                var l = h, m = k, p = d;
                if (l.noHScroll) {
                    (c.alignable || (c.alignable = [])).push(m);
                    var n = p.wrapperWidth;
                    m.style.left = p.fixedPos + "px";
                    l.coverGutter || (n -= p.gutterTotalWidth, m.style.paddingLeft = p.gutterTotalWidth + "px");
                    m.style.width = n + "px"
                }
                l.coverGutter && (m.style.zIndex = 5, m.style.position = "relative", l.noHScroll || (m.style.marginLeft = -p.gutterTotalWidth + "px"));
                a.display.input.setUneditable(k);
                e && h.above ?
                    f.insertBefore(k, c.gutter || c.text) : f.appendChild(k);
                L(h, "redraw")
            }
        }
    }

    function Rc(a) {
        return r(a.line, a.ch)
    }

    function Pb(a, b) {
        return 0 > y(a, b) ? b : a
    }

    function Qb(a, b) {
        return 0 > y(a, b) ? a : b
    }

    function Ud(a) {
        a.state.focused || (a.display.input.focus(), xc(a))
    }

    function Rb(a) {
        return a.options.readOnly || a.doc.cantEdit
    }

    function Sc(a, b, c, d, e) {
        var f = a.doc;
        a.display.shift = !1;
        d || (d = f.sel);
        var g = sa(b), h = null;
        a.state.pasteIncoming && 1 < d.ranges.length && (X && X.join("\n") == b ? h = 0 == d.ranges.length % X.length && ob(X, sa) : g.length == d.ranges.length &&
        (h = ob(g, function (a) {
            return [a]
        })));
        for (var k = d.ranges.length - 1; 0 <= k; k--) {
            var l = d.ranges[k], m = l.from(), p = l.to();
            l.empty() && (c && 0 < c ? m = r(m.line, m.ch - c) : a.state.overwrite && !a.state.pasteIncoming && (p = r(p.line, Math.min(u(f, p.line).text.length, p.ch + A(g).length))));
            var n = a.curOp.updateInput, m = {
                from: m,
                to: p,
                text: h ? h[k % h.length] : g,
                origin: e || (a.state.pasteIncoming ? "paste" : a.state.cutIncoming ? "cut" : "+input")
            };
            Oa(a.doc, m);
            L(a, "inputRead", a, m);
            if (b && !a.state.pasteIncoming && a.options.electricChars && a.options.smartIndent &&
                100 > l.head.ch && (!k || d.ranges[k - 1].head.line != l.head.line)) {
                l = a.getModeAt(l.head);
                m = ta(m);
                p = !1;
                if (l.electricChars)for (var E = 0; E < l.electricChars.length; E++) {
                    if (-1 < b.indexOf(l.electricChars.charAt(E))) {
                        p = pb(a, m.line, "smart");
                        break
                    }
                } else l.electricInput && l.electricInput.test(u(f, m.line).text.slice(0, m.ch)) && (p = pb(a, m.line, "smart"));
                p && L(a, "electricInput", a, m.line)
            }
        }
        Pa(a);
        a.curOp.updateInput = n;
        a.curOp.typing = !0;
        a.state.pasteIncoming = a.state.cutIncoming = !1
    }

    function Vd(a) {
        for (var b = [], c = [], d = 0; d < a.doc.sel.ranges.length; d++) {
            var e =
                a.doc.sel.ranges[d].head.line, e = {anchor: r(e, 0), head: r(e + 1, 0)};
            c.push(e);
            b.push(a.getRange(e.anchor, e.head))
        }
        return {text: b, ranges: c}
    }

    function Wd(a) {
        a.setAttribute("autocorrect", "off");
        a.setAttribute("autocapitalize", "off");
        a.setAttribute("spellcheck", "false")
    }

    function Tc(a) {
        this.cm = a;
        this.prevInput = "";
        this.pollingFast = !1;
        this.polling = new bb;
        this.hasSelection = this.inaccurateSelection = !1;
        this.composing = null
    }

    function Xd() {
        var a = t("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),
            b = t("div", [a], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
        J ? a.style.width = "1000px" : a.setAttribute("wrap", "off");
        Qa && (a.style.border = "1px solid black");
        Wd(a);
        return b
    }

    function Uc(a) {
        this.cm = a;
        this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
        this.polling = new bb;
        this.gracePeriod = !1
    }

    function Yd(a, b) {
        var c = Vc(a, b.line);
        if (!c || c.hidden)return null;
        var d = u(a.doc, b.line), c = Zd(c, d, b.line);
        (d = Y(d)) && Sb(d, b.ch);
        d = $d(c.map, b.ch, "left");
        d.offset =
            "right" == d.collapse ? d.end : d.start;
        return d
    }

    function Ra(a, b) {
        b && (a.bad = !0);
        return a
    }

    function Tb(a, b, c) {
        var d;
        if (b == a.display.lineDiv) {
            d = a.display.lineDiv.childNodes[c];
            if (!d)return Ra(a.clipPos(r(a.display.viewTo - 1)), !0);
            b = null;
            c = 0
        } else for (d = b; ; d = d.parentNode) {
            if (!d || d == a.display.lineDiv)return null;
            if (d.parentNode && d.parentNode == a.display.lineDiv)break
        }
        for (var e = 0; e < a.display.view.length; e++) {
            var f = a.display.view[e];
            if (f.node == d)return wf(f, b, c)
        }
    }

    function wf(a, b, c) {
        function d(b, c, d) {
            for (var e = -1; e <
            (l ? l.length : 0); e++)for (var f = 0 > e ? k.map : l[e], g = 0; g < f.length; g += 3) {
                var h = f[g + 2];
                if (h == b || h == c) {
                    c = F(0 > e ? a.line : a.rest[e]);
                    e = f[g] + d;
                    if (0 > d || h != b)e = f[g + (d ? 1 : 0)];
                    return r(c, e)
                }
            }
        }

        var e = a.text.firstChild, f = !1;
        if (!b || !Wc(e, b))return Ra(r(F(a.line), 0), !0);
        if (b == e && (f = !0, b = e.childNodes[c], c = 0, !b))return c = a.rest ? A(a.rest) : a.line, Ra(r(F(c), c.text.length), f);
        var g = 3 == b.nodeType ? b : null, h = b;
        g || 1 != b.childNodes.length || 3 != b.firstChild.nodeType || (g = b.firstChild, c && (c = g.nodeValue.length));
        for (; h.parentNode != e;)h = h.parentNode;
        var k = a.measure, l = k.maps;
        if (b = d(g, h, c))return Ra(b, f);
        e = h.nextSibling;
        for (g = g ? g.nodeValue.length - c : 0; e; e = e.nextSibling) {
            if (b = d(e, e.firstChild, 0))return Ra(r(b.line, b.ch - g), f);
            g += e.textContent.length
        }
        h = h.previousSibling;
        for (g = c; h; h = h.previousSibling) {
            if (b = d(h, h.firstChild, -1))return Ra(r(b.line, b.ch + g), f);
            g += e.textContent.length
        }
    }

    function xf(a, b, c, d, e) {
        function f(a) {
            return function (b) {
                return b.id == a
            }
        }

        function g(b) {
            if (1 == b.nodeType) {
                var c = b.getAttribute("cm-text");
                if (null != c)"" == c && (c = b.textContent.replace(/\u200b/g,
                    "")), h += c; else {
                    var c = b.getAttribute("cm-marker"), p;
                    if (c)b = a.findMarks(r(d, 0), r(e + 1, 0), f(+c)), b.length && (p = b[0].find()) && (h += Da(a.doc, p.from, p.to).join("\n")); else if ("false" != b.getAttribute("contenteditable")) {
                        for (p = 0; p < b.childNodes.length; p++)g(b.childNodes[p]);
                        /^(pre|div|p)$/i.test(b.nodeName) && (k = !0)
                    }
                }
            } else 3 == b.nodeType && (b = b.nodeValue) && (k && (h += "\n", k = !1), h += b)
        }

        for (var h = "", k = !1; ;) {
            g(b);
            if (b == c)break;
            b = b.nextSibling
        }
        return h
    }

    function la(a, b) {
        this.ranges = a;
        this.primIndex = b
    }

    function z(a, b) {
        this.anchor =
            a;
        this.head = b
    }

    function Z(a, b) {
        var c = a[b];
        a.sort(function (a, b) {
            return y(a.from(), b.from())
        });
        b = D(a, c);
        for (c = 1; c < a.length; c++) {
            var d = a[c], e = a[c - 1];
            if (0 <= y(e.to(), d.from())) {
                var f = Qb(e.from(), d.from()), g = Pb(e.to(), d.to()), d = e.empty() ? d.from() == d.head : e.from() == e.head;
                c <= b && --b;
                a.splice(--c, 2, new z(d ? g : f, d ? f : g))
            }
        }
        return new la(a, b)
    }

    function ga(a, b) {
        return new la([new z(a, b || a)], 0)
    }

    function w(a, b) {
        if (b.line < a.first)return r(a.first, 0);
        var c = a.first + a.size - 1;
        if (b.line > c)return r(c, u(a, c).text.length);
        var c =
            u(a, b.line).text.length, d = b.ch, c = null == d || d > c ? r(b.line, c) : 0 > d ? r(b.line, 0) : b;
        return c
    }

    function qb(a, b) {
        return b >= a.first && b < a.first + a.size
    }

    function rb(a, b, c, d) {
        return a.cm && a.cm.display.shift || a.extend ? (a = b.anchor, d && (b = 0 > y(c, a), b != 0 > y(d, a) ? (a = c, c = d) : b != 0 > y(c, d) && (c = d)), new z(a, c)) : new z(d || c, c)
    }

    function Ub(a, b, c, d) {
        H(a, new la([rb(a, a.sel.primary(), b, c)], 0), d)
    }

    function ae(a, b, c) {
        for (var d = [], e = 0; e < a.sel.ranges.length; e++)d[e] = rb(a, a.sel.ranges[e], b[e], null);
        b = Z(d, a.sel.primIndex);
        H(a, b, c)
    }

    function Xc(a,
                b, c, d) {
        var e = a.sel.ranges.slice(0);
        e[b] = c;
        H(a, Z(e, a.sel.primIndex), d)
    }

    function yf(a, b) {
        var c = {
            ranges: b.ranges, update: function (b) {
                this.ranges = [];
                for (var c = 0; c < b.length; c++)this.ranges[c] = new z(w(a, b[c].anchor), w(a, b[c].head))
            }
        };
        K(a, "beforeSelectionChange", a, c);
        a.cm && K(a.cm, "beforeSelectionChange", a.cm, c);
        return c.ranges != b.ranges ? Z(c.ranges, c.ranges.length - 1) : b
    }

    function be(a, b, c) {
        var d = a.history.done, e = A(d);
        e && e.ranges ? (d[d.length - 1] = b, Vb(a, b, c)) : H(a, b, c)
    }

    function H(a, b, c) {
        Vb(a, b, c);
        b = a.sel;
        var d =
            a.cm ? a.cm.curOp.id : NaN, e = a.history, f = c && c.origin, g;
        if (!(g = d == e.lastSelOp) && (g = f && e.lastSelOrigin == f) && !(g = e.lastModTime == e.lastSelTime && e.lastOrigin == f)) {
            g = A(e.done);
            var h = f.charAt(0);
            g = "*" == h || "+" == h && g.ranges.length == b.ranges.length && g.somethingSelected() == b.somethingSelected() && new Date - a.history.lastSelTime <= (a.cm ? a.cm.options.historyEventDelay : 500)
        }
        g ? e.done[e.done.length - 1] = b : Wb(b, e.done);
        e.lastSelTime = +new Date;
        e.lastSelOrigin = f;
        e.lastSelOp = d;
        c && !1 !== c.clearRedo && ce(e.undone)
    }

    function Vb(a,
                b, c) {
        if (S(a, "beforeSelectionChange") || a.cm && S(a.cm, "beforeSelectionChange"))b = yf(a, b);
        var d = c && c.bias || (0 > y(b.primary().head, a.sel.primary().head) ? -1 : 1);
        de(a, ee(a, b, d, !0));
        c && !1 === c.scroll || !a.cm || Pa(a.cm)
    }

    function de(a, b) {
        b.equals(a.sel) || (a.sel = b, a.cm && (a.cm.curOp.updateInput = a.cm.curOp.selectionChanged = !0, fe(a.cm)), L(a, "cursorActivity", a))
    }

    function ge(a) {
        de(a, ee(a, a.sel, null, !1), ha)
    }

    function ee(a, b, c, d) {
        for (var e, f = 0; f < b.ranges.length; f++) {
            var g = b.ranges[f], h = Xb(a, g.anchor, c, d), k = Xb(a, g.head, c,
                d);
            if (e || h != g.anchor || k != g.head)e || (e = b.ranges.slice(0, f)), e[f] = new z(h, k)
        }
        return e ? Z(e, b.primIndex) : b
    }

    function Xb(a, b, c, d) {
        var e = !1, f = b, g = c || 1;
        a.cantEdit = !1;
        a:for (; ;) {
            var h = u(a, f.line);
            if (h.markedSpans)for (var k = 0; k < h.markedSpans.length; ++k) {
                var l = h.markedSpans[k], m = l.marker;
                if ((null == l.from || (m.inclusiveLeft ? l.from <= f.ch : l.from < f.ch)) && (null == l.to || (m.inclusiveRight ? l.to >= f.ch : l.to > f.ch))) {
                    if (d && (K(m, "beforeCursorEnter"), m.explicitlyCleared))if (h.markedSpans) {
                        --k;
                        continue
                    } else break;
                    if (m.atomic) {
                        k =
                            m.find(0 > g ? -1 : 1);
                        if (0 == y(k, f) && (k.ch += g, 0 > k.ch ? k = k.line > a.first ? w(a, r(k.line - 1)) : null : k.ch > h.text.length && (k = k.line < a.first + a.size - 1 ? r(k.line + 1, 0) : null), !k)) {
                            if (e) {
                                if (!d)return Xb(a, b, c, !0);
                                a.cantEdit = !0;
                                return r(a.first, 0)
                            }
                            e = !0;
                            k = b;
                            g = -g
                        }
                        f = k;
                        continue a
                    }
                }
            }
            return f
        }
    }

    function nb(a) {
        a.display.input.showSelection(a.display.input.prepareSelection())
    }

    function he(a, b) {
        for (var c = a.doc, d = {}, e = d.cursors = document.createDocumentFragment(), f = d.selection = document.createDocumentFragment(), g = 0; g < c.sel.ranges.length; g++)if (!1 !==
            b || g != c.sel.primIndex) {
            var h = c.sel.ranges[g], k = h.empty();
            if (k || a.options.showCursorWhenSelecting) {
                var l = a, m = e, p = ma(l, h.head, "div", null, null, !l.options.singleCursorHeightPerLine), n = m.appendChild(t("div", " ", "CodeMirror-cursor"));
                n.style.left = p.left + "px";
                n.style.top = p.top + "px";
                n.style.height = Math.max(0, p.bottom - p.top) * l.options.cursorHeight + "px";
                p.other && (l = m.appendChild(t("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor")), l.style.display = "", l.style.left = p.other.left + "px", l.style.top = p.other.top +
                "px", l.style.height = .85 * (p.other.bottom - p.other.top) + "px")
            }
            k || zf(a, h, f)
        }
        return d
    }

    function zf(a, b, c) {
        function d(a, b, c, d) {
            0 > b && (b = 0);
            b = Math.round(b);
            d = Math.round(d);
            h.appendChild(t("div", null, "CodeMirror-selected", "position: absolute; left: " + a + "px; top: " + b + "px; width: " + (null == c ? m - a : c) + "px; height: " + (d - b) + "px"))
        }

        function e(b, c, e) {
            var f = u(g, b), h = f.text.length, k, p;
            Af(Y(f), c || 0, null == e ? h : e, function (g, q, t) {
                var u = Yb(a, r(b, g), "div", f, "left"), v, w;
                g == q ? (v = u, t = w = u.left) : (v = Yb(a, r(b, q - 1), "div", f, "right"),
                "rtl" == t && (t = u, u = v, v = t), t = u.left, w = v.right);
                null == c && 0 == g && (t = l);
                3 < v.top - u.top && (d(t, u.top, null, u.bottom), t = l, u.bottom < v.top && d(t, u.bottom, null, v.top));
                null == e && q == h && (w = m);
                if (!k || u.top < k.top || u.top == k.top && u.left < k.left)k = u;
                if (!p || v.bottom > p.bottom || v.bottom == p.bottom && v.right > p.right)p = v;
                t < l + 1 && (t = l);
                d(t, v.top, w - t, v.bottom)
            });
            return {start: k, end: p}
        }

        var f = a.display, g = a.doc, h = document.createDocumentFragment(), k = ie(a.display), l = k.left, m = Math.max(f.sizerWidth, pa(a) - f.sizer.offsetLeft) - k.right, f = b.from();
        b = b.to();
        if (f.line == b.line)e(f.line, f.ch, b.ch); else {
            var p = u(g, f.line), k = u(g, b.line), k = ia(p) == ia(k), f = e(f.line, f.ch, k ? p.text.length + 1 : null).end;
            b = e(b.line, k ? 0 : null, b.ch).start;
            k && (f.top < b.top - 2 ? (d(f.right, f.top, null, f.bottom), d(l, b.top, b.left, b.bottom)) : d(f.right, f.top, b.left - f.right, f.bottom));
            f.bottom < b.top && d(l, f.bottom, null, b.top)
        }
        c.appendChild(h)
    }

    function Yc(a) {
        if (a.state.focused) {
            var b = a.display;
            clearInterval(b.blinker);
            var c = !0;
            b.cursorDiv.style.visibility = "";
            0 < a.options.cursorBlinkRate ? b.blinker =
                setInterval(function () {
                    b.cursorDiv.style.visibility = (c = !c) ? "" : "hidden"
                }, a.options.cursorBlinkRate) : 0 > a.options.cursorBlinkRate && (b.cursorDiv.style.visibility = "hidden")
        }
    }

    function fb(a, b) {
        a.doc.mode.startState && a.doc.frontier < a.display.viewTo && a.state.highlight.set(b, cb(Bf, a))
    }

    function Bf(a) {
        var b = a.doc;
        b.frontier < b.first && (b.frontier = b.first);
        if (!(b.frontier >= a.display.viewTo)) {
            var c = +new Date + a.options.workTime, d = Sa(b.mode, sb(a, b.frontier)), e = [];
            b.iter(b.frontier, Math.min(b.first + b.size, a.display.viewTo +
            500), function (f) {
                if (b.frontier >= a.display.viewFrom) {
                    var g = f.styles, h = je(a, f, d, !0);
                    f.styles = h.styles;
                    var k = f.styleClasses;
                    (h = h.classes) ? f.styleClasses = h : k && (f.styleClasses = null);
                    k = !g || g.length != f.styles.length || k != h && (!k || !h || k.bgClass != h.bgClass || k.textClass != h.textClass);
                    for (h = 0; !k && h < g.length; ++h)k = g[h] != f.styles[h];
                    k && e.push(b.frontier);
                    f.stateAfter = Sa(b.mode, d)
                } else Zc(a, f.text, d), f.stateAfter = 0 == b.frontier % 5 ? Sa(b.mode, d) : null;
                ++b.frontier;
                if (+new Date > c)return fb(a, a.options.workDelay), !0
            });
            e.length && T(a, function () {
                for (var b = 0; b < e.length; b++)na(a, e[b], "text")
            })
        }
    }

    function Cf(a, b, c) {
        for (var d, e, f = a.doc, g = c ? -1 : b - (a.doc.mode.innerMode ? 1E3 : 100); b > g; --b) {
            if (b <= f.first)return f.first;
            var h = u(f, b - 1);
            if (h.stateAfter && (!c || b <= f.frontier))return b;
            h = aa(h.text, null, a.options.tabSize);
            if (null == e || d > h)e = b - 1, d = h
        }
        return e
    }

    function sb(a, b, c) {
        var d = a.doc, e = a.display;
        if (!d.mode.startState)return !0;
        var f = Cf(a, b, c), g = f > d.first && u(d, f - 1).stateAfter, g = g ? Sa(d.mode, g) : Df(d.mode);
        d.iter(f, b, function (c) {
            Zc(a,
                c.text, g);
            c.stateAfter = f == b - 1 || 0 == f % 5 || f >= e.viewFrom && f < e.viewTo ? Sa(d.mode, g) : null;
            ++f
        });
        c && (d.frontier = f);
        return g
    }

    function Ec(a) {
        return a.mover.offsetHeight - a.lineSpace.offsetHeight
    }

    function ie(a) {
        if (a.cachedPaddingH)return a.cachedPaddingH;
        var b = U(a.measure, t("pre", "x")), b = window.getComputedStyle ? window.getComputedStyle(b) : b.currentStyle, b = {
            left: parseInt(b.paddingLeft),
            right: parseInt(b.paddingRight)
        };
        isNaN(b.left) || isNaN(b.right) || (a.cachedPaddingH = b);
        return b
    }

    function da(a) {
        return Hd - a.display.nativeBarWidth
    }

    function pa(a) {
        return a.display.scroller.clientWidth - da(a) - a.display.barWidth
    }

    function Nc(a) {
        return a.display.scroller.clientHeight - da(a) - a.display.barHeight
    }

    function Zd(a, b, c) {
        if (a.line == b)return {map: a.measure.map, cache: a.measure.cache};
        for (var d = 0; d < a.rest.length; d++)if (a.rest[d] == b)return {
            map: a.measure.maps[d],
            cache: a.measure.caches[d]
        };
        for (d = 0; d < a.rest.length; d++)if (F(a.rest[d]) > c)return {
            map: a.measure.maps[d],
            cache: a.measure.caches[d],
            before: !0
        }
    }

    function Vc(a, b) {
        if (b >= a.display.viewFrom && b < a.display.viewTo)return a.display.view[Ca(a,
            b)];
        var c = a.display.externalMeasured;
        if (c && b >= c.lineN && b < c.lineN + c.size)return c
    }

    function Zb(a, b) {
        var c = F(b), d = Vc(a, c);
        d && !d.text ? d = null : d && d.changes && Od(a, d, c, Kc(a));
        if (!d) {
            var e;
            e = ia(b);
            d = F(e);
            e = a.display.externalMeasured = new ke(a.doc, e, d);
            e.lineN = d;
            d = e.built = Sd(a, e);
            e.text = d.pre;
            U(a.display.lineMeasure, d.pre);
            d = e
        }
        c = Zd(d, b, c);
        return {line: b, view: d, rect: null, map: c.map, cache: c.cache, before: c.before, hasHeights: !1}
    }

    function $c(a, b, c, d, e) {
        b.before && (c = -1);
        var f = c + (d || "");
        if (b.cache.hasOwnProperty(f))a =
            b.cache[f]; else {
            b.rect || (b.rect = b.view.text.getBoundingClientRect());
            if (!b.hasHeights) {
                var g = b.view, h = b.rect, k = a.options.lineWrapping, l = k && pa(a);
                if (!g.measure.heights || k && g.measure.width != l) {
                    var m = g.measure.heights = [];
                    if (k)for (g.measure.width = l, g = g.text.firstChild.getClientRects(), k = 0; k < g.length - 1; k++) {
                        var l = g[k], p = g[k + 1];
                        2 < Math.abs(l.bottom - p.bottom) && m.push((l.bottom + p.top) / 2 - h.top)
                    }
                    m.push(h.bottom - h.top)
                }
                b.hasHeights = !0
            }
            g = d;
            k = $d(b.map, c, g);
            d = k.node;
            h = k.start;
            l = k.end;
            c = k.collapse;
            var n;
            if (3 == d.nodeType) {
                for (m =
                         0; 4 > m; m++) {
                    for (; h && tb(b.line.text.charAt(k.coverStart + h));)--h;
                    for (; k.coverStart + l < k.coverEnd && tb(b.line.text.charAt(k.coverStart + l));)++l;
                    if (B && 9 > C && 0 == h && l == k.coverEnd - k.coverStart)n = d.parentNode.getBoundingClientRect(); else if (B && a.options.lineWrapping) {
                        var E = Ea(d, h, l).getClientRects();
                        n = E.length ? E["right" == g ? E.length - 1 : 0] : ad
                    } else n = Ea(d, h, l).getBoundingClientRect() || ad;
                    if (n.left || n.right || 0 == h)break;
                    l = h;
                    --h;
                    c = "right"
                }
                B && 11 > C && ((E = !window.screen || null == screen.logicalXDPI || screen.logicalXDPI == screen.deviceXDPI) ||
                (null != bd ? E = bd : (m = U(a.display.measure, t("span", "x")), E = m.getBoundingClientRect(), m = Ea(m, 0, 1).getBoundingClientRect(), E = bd = 1 < Math.abs(E.left - m.left)), E = !E), E || (E = screen.logicalXDPI / screen.deviceXDPI, m = screen.logicalYDPI / screen.deviceYDPI, n = {
                    left: n.left * E,
                    right: n.right * E,
                    top: n.top * m,
                    bottom: n.bottom * m
                }))
            } else 0 < h && (c = g = "right"), n = a.options.lineWrapping && 1 < (E = d.getClientRects()).length ? E["right" == g ? E.length - 1 : 0] : d.getBoundingClientRect();
            !(B && 9 > C) || h || n && (n.left || n.right) || (n = (n = d.parentNode.getClientRects()[0]) ?
            {left: n.left, right: n.left + gb(a.display), top: n.top, bottom: n.bottom} : ad);
            E = n.top - b.rect.top;
            d = n.bottom - b.rect.top;
            h = (E + d) / 2;
            g = b.view.measure.heights;
            for (m = 0; m < g.length - 1 && !(h < g[m]); m++);
            c = {
                left: ("right" == c ? n.right : n.left) - b.rect.left,
                right: ("left" == c ? n.left : n.right) - b.rect.left,
                top: m ? g[m - 1] : 0,
                bottom: g[m]
            };
            n.left || n.right || (c.bogus = !0);
            a.options.singleCursorHeightPerLine || (c.rtop = E, c.rbottom = d);
            a = c;
            a.bogus || (b.cache[f] = a)
        }
        return {left: a.left, right: a.right, top: e ? a.rtop : a.top, bottom: e ? a.rbottom : a.bottom}
    }

    function $d(a, b, c) {
        for (var d, e, f, g, h = 0; h < a.length; h += 3) {
            var k = a[h], l = a[h + 1];
            if (b < k)e = 0, f = 1, g = "left"; else if (b < l)e = b - k, f = e + 1; else if (h == a.length - 3 || b == l && a[h + 3] > b)f = l - k, e = f - 1, b >= l && (g = "right");
            if (null != e) {
                d = a[h + 2];
                k == l && c == (d.insertLeft ? "left" : "right") && (g = c);
                if ("left" == c && 0 == e)for (; h && a[h - 2] == a[h - 3] && a[h - 1].insertLeft;)d = a[(h -= 3) + 2], g = "left";
                if ("right" == c && e == l - k)for (; h < a.length - 3 && a[h + 3] == a[h + 4] && !a[h + 5].insertLeft;)d = a[(h += 3) + 2], g = "right";
                break
            }
        }
        return {
            node: d, start: e, end: f, collapse: g, coverStart: k,
            coverEnd: l
        }
    }

    function le(a) {
        if (a.measure && (a.measure.cache = {}, a.measure.heights = null, a.rest))for (var b = 0; b < a.rest.length; b++)a.measure.caches[b] = {}
    }

    function me(a) {
        a.display.externalMeasure = null;
        za(a.display.lineMeasure);
        for (var b = 0; b < a.display.view.length; b++)le(a.display.view[b])
    }

    function hb(a) {
        me(a);
        a.display.cachedCharWidth = a.display.cachedTextHeight = a.display.cachedPaddingH = null;
        a.options.lineWrapping || (a.display.maxLineChanged = !0);
        a.display.lineNumChars = null
    }

    function cd(a, b, c, d) {
        if (b.widgets)for (var e =
            0; e < b.widgets.length; ++e)if (b.widgets[e].above) {
            var f = ub(b.widgets[e]);
            c.top += f;
            c.bottom += f
        }
        if ("line" == d)return c;
        d || (d = "local");
        b = ea(b);
        b = "local" == d ? b + a.display.lineSpace.offsetTop : b - a.display.viewOffset;
        if ("page" == d || "window" == d)a = a.display.lineSpace.getBoundingClientRect(), b += a.top + ("window" == d ? 0 : window.pageYOffset || (document.documentElement || document.body).scrollTop), d = a.left + ("window" == d ? 0 : window.pageXOffset || (document.documentElement || document.body).scrollLeft), c.left += d, c.right += d;
        c.top += b;
        c.bottom += b;
        return c
    }

    function ne(a, b, c) {
        if ("div" == c)return b;
        var d = b.left;
        b = b.top;
        "page" == c ? (d -= window.pageXOffset || (document.documentElement || document.body).scrollLeft, b -= window.pageYOffset || (document.documentElement || document.body).scrollTop) : "local" != c && c || (c = a.display.sizer.getBoundingClientRect(), d += c.left, b += c.top);
        a = a.display.lineSpace.getBoundingClientRect();
        return {left: d - a.left, top: b - a.top}
    }

    function Yb(a, b, c, d, e) {
        d || (d = u(a.doc, b.line));
        var f = d;
        b = b.ch;
        d = $c(a, Zb(a, d), b, e);
        return cd(a, f, d, c)
    }

    function ma(a, b, c, d, e, f) {
        function g(b, g) {
            var h = $c(a, e, b, g ? "right" : "left", f);
            g ? h.left = h.right : h.right = h.left;
            return cd(a, d, h, c)
        }

        function h(a, b) {
            var c = k[b], d = c.level % 2;
            a == dd(c) && b && c.level < k[b - 1].level ? (c = k[--b], a = ed(c) - (c.level % 2 ? 0 : 1), d = !0) : a == ed(c) && b < k.length - 1 && c.level < k[b + 1].level && (c = k[++b], a = dd(c) - c.level % 2, d = !1);
            return d && a == c.to && a > c.from ? g(a - 1) : g(a, d)
        }

        d = d || u(a.doc, b.line);
        e || (e = Zb(a, d));
        var k = Y(d);
        b = b.ch;
        if (!k)return g(b);
        var l = Sb(k, b), l = h(b, l);
        null != vb && (l.other = h(b, vb));
        return l
    }

    function oe(a,
                b) {
        var c = 0;
        b = w(a.doc, b);
        a.options.lineWrapping || (c = gb(a.display) * b.ch);
        var d = u(a.doc, b.line), e = ea(d) + a.display.lineSpace.offsetTop;
        return {left: c, right: c, top: e, bottom: e + d.height}
    }

    function $b(a, b, c, d) {
        a = r(a, b);
        a.xRel = d;
        c && (a.outside = !0);
        return a
    }

    function fd(a, b, c) {
        var d = a.doc;
        c += a.display.viewOffset;
        if (0 > c)return $b(d.first, 0, !0, -1);
        var e = Ba(d, c), f = d.first + d.size - 1;
        if (e > f)return $b(d.first + d.size - 1, u(d, f).text.length, !0, 1);
        0 > b && (b = 0);
        for (d = u(d, e); ;)if (e = Ef(a, d, e, b, c), f = (d = Aa(d, !1)) && d.find(0, !0), d &&
            (e.ch > f.from.ch || e.ch == f.from.ch && 0 < e.xRel))e = F(d = f.to.line); else return e
    }

    function Ef(a, b, c, d, e) {
        function f(d) {
            d = ma(a, r(c, d), "line", b, l);
            h = !0;
            if (g > d.bottom)return d.left - k;
            if (g < d.top)return d.left + k;
            h = !1;
            return d.left
        }

        var g = e - ea(b), h = !1, k = 2 * a.display.wrapper.clientWidth, l = Zb(a, b), m = Y(b), p = b.text.length;
        e = ac(b);
        var n = bc(b), E = f(e), q = h, t = f(n), u = h;
        if (d > t)return $b(c, n, u, 1);
        for (; ;) {
            if (m ? n == e || n == gd(b, e, 1) : 1 >= n - e) {
                m = d < E || d - E <= t - d ? e : n;
                for (d -= m == e ? E : t; tb(b.text.charAt(m));)++m;
                return $b(c, m, m == e ? q : u, -1 >
                d ? -1 : 1 < d ? 1 : 0)
            }
            var v = Math.ceil(p / 2), w = e + v;
            if (m)for (var w = e, x = 0; x < v; ++x)w = gd(b, w, 1);
            x = f(w);
            if (x > d) {
                n = w;
                t = x;
                if (u = h)t += 1E3;
                p = v
            } else e = w, E = x, q = h, p -= v
        }
    }

    function xa(a) {
        if (null != a.cachedTextHeight)return a.cachedTextHeight;
        if (null == Fa) {
            Fa = t("pre");
            for (var b = 0; 49 > b; ++b)Fa.appendChild(document.createTextNode("x")), Fa.appendChild(t("br"));
            Fa.appendChild(document.createTextNode("x"))
        }
        U(a.measure, Fa);
        b = Fa.offsetHeight / 50;
        3 < b && (a.cachedTextHeight = b);
        za(a.measure);
        return b || 1
    }

    function gb(a) {
        if (null != a.cachedCharWidth)return a.cachedCharWidth;
        var b = t("span", "xxxxxxxxxx"), c = t("pre", [b]);
        U(a.measure, c);
        b = b.getBoundingClientRect();
        b = (b.right - b.left) / 10;
        2 < b && (a.cachedCharWidth = b);
        return b || 10
    }

    function Ja(a) {
        a.curOp = {
            cm: a,
            viewChanged: !1,
            startHeight: a.doc.height,
            forceUpdate: !1,
            updateInput: null,
            typing: !1,
            changeObjs: null,
            cursorActivityHandlers: null,
            cursorActivityCalled: 0,
            selectionChanged: !1,
            updateMaxLine: !1,
            scrollLeft: null,
            scrollTop: null,
            scrollToPos: null,
            focus: !1,
            id: ++Ff
        };
        Ta ? Ta.ops.push(a.curOp) : a.curOp.ownsGroup = Ta = {ops: [a.curOp], delayedCallbacks: []}
    }

    function La(a) {
        if (a = a.curOp.ownsGroup)try {
            var b = a.delayedCallbacks, c = 0;
            do {
                for (; c < b.length; c++)b[c]();
                for (var d = 0; d < a.ops.length; d++) {
                    var e = a.ops[d];
                    if (e.cursorActivityHandlers)for (; e.cursorActivityCalled < e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++](e.cm)
                }
            } while (c < b.length)
        } finally {
            Ta = null;
            for (b = 0; b < a.ops.length; b++)a.ops[b].cm.curOp = null;
            a = a.ops;
            for (b = 0; b < a.length; b++) {
                var e = a[b], c = e.cm, f = d = c.display;
                !f.scrollbarsClipped && f.scroller.offsetWidth && (f.nativeBarWidth =
                    f.scroller.offsetWidth - f.scroller.clientWidth, f.heightForcer.style.height = da(c) + "px", f.sizer.style.marginBottom = -f.nativeBarWidth + "px", f.sizer.style.borderRightWidth = da(c) + "px", f.scrollbarsClipped = !0);
                e.updateMaxLine && Dc(c);
                e.mustUpdate = e.viewChanged || e.forceUpdate || null != e.scrollTop || e.scrollToPos && (e.scrollToPos.from.line < d.viewFrom || e.scrollToPos.to.line >= d.viewTo) || d.maxLineChanged && c.options.lineWrapping;
                e.update = e.mustUpdate && new Mb(c, e.mustUpdate && {
                    top: e.scrollTop,
                    ensure: e.scrollToPos
                }, e.forceUpdate)
            }
            for (b =
                     0; b < a.length; b++)e = a[b], e.updatedDisplay = e.mustUpdate && Lc(e.cm, e.update);
            for (b = 0; b < a.length; b++)if (e = a[b], c = e.cm, d = c.display, e.updatedDisplay && Lb(c), e.barMeasure = jb(c), d.maxLineChanged && !c.options.lineWrapping && (f = void 0, f = d.maxLine.text.length, f = $c(c, Zb(c, d.maxLine), f, void 0), e.adjustWidthTo = f.left + 3, c.display.sizerWidth = e.adjustWidthTo, e.barMeasure.scrollWidth = Math.max(d.scroller.clientWidth, d.sizer.offsetLeft + e.adjustWidthTo + da(c) + c.display.barWidth), e.maxScrollLeft = Math.max(0, d.sizer.offsetLeft +
                e.adjustWidthTo - pa(c))), e.updatedDisplay || e.selectionChanged)e.preparedSelection = d.input.prepareSelection();
            for (b = 0; b < a.length; b++)e = a[b], c = e.cm, null != e.adjustWidthTo && (c.display.sizer.style.minWidth = e.adjustWidthTo + "px", e.maxScrollLeft < c.doc.scrollLeft && Ma(c, Math.min(c.display.scroller.scrollLeft, e.maxScrollLeft), !0), c.display.maxLineChanged = !1), e.preparedSelection && c.display.input.showSelection(e.preparedSelection), e.updatedDisplay && Oc(c, e.barMeasure), (e.updatedDisplay || e.startHeight != c.doc.height) &&
            Na(c, e.barMeasure), e.selectionChanged && Yc(c), c.state.focused && e.updateInput && c.display.input.reset(e.typing), e.focus && e.focus == fa() && Ud(e.cm);
            for (b = 0; b < a.length; b++) {
                e = a[b];
                c = e.cm;
                d = c.display;
                f = c.doc;
                e.updatedDisplay && Md(c, e.update);
                null == d.wheelStartX || null == e.scrollTop && null == e.scrollLeft && !e.scrollToPos || (d.wheelStartX = d.wheelStartY = null);
                null == e.scrollTop || d.scroller.scrollTop == e.scrollTop && !e.forceScroll || (f.scrollTop = Math.max(0, Math.min(d.scroller.scrollHeight - d.scroller.clientHeight, e.scrollTop)),
                    d.scrollbars.setScrollTop(f.scrollTop), d.scroller.scrollTop = f.scrollTop);
                null == e.scrollLeft || d.scroller.scrollLeft == e.scrollLeft && !e.forceScroll || (f.scrollLeft = Math.max(0, Math.min(d.scroller.scrollWidth - pa(c), e.scrollLeft)), d.scrollbars.setScrollLeft(f.scrollLeft), d.scroller.scrollLeft = f.scrollLeft, Bc(c));
                if (e.scrollToPos) {
                    var g = void 0, h = w(f, e.scrollToPos.from), g = w(f, e.scrollToPos.to), k = e.scrollToPos.margin;
                    null == k && (k = 0);
                    for (var l = 0; 5 > l; l++) {
                        var m = !1, p = ma(c, h), n = g && g != h ? ma(c, g) : p, n = cc(c, Math.min(p.left,
                            n.left), Math.min(p.top, n.top) - k, Math.max(p.left, n.left), Math.max(p.bottom, n.bottom) + k), q = c.doc.scrollTop, r = c.doc.scrollLeft;
                        null != n.scrollTop && (lb(c, n.scrollTop), 1 < Math.abs(c.doc.scrollTop - q) && (m = !0));
                        null != n.scrollLeft && (Ma(c, n.scrollLeft), 1 < Math.abs(c.doc.scrollLeft - r) && (m = !0));
                        if (!m)break
                    }
                    g = p;
                    e.scrollToPos.isCursor && c.state.focused && (ja(c, "scrollCursorIntoView") || (k = c.display, l = k.sizer.getBoundingClientRect(), h = null, 0 > g.top + l.top ? h = !0 : g.bottom + l.top > (window.innerHeight || document.documentElement.clientHeight) &&
                    (h = !1), null == h || Gf || (g = t("div", "​", null, "position: absolute; top: " + (g.top - k.viewOffset - c.display.lineSpace.offsetTop) + "px; height: " + (g.bottom - g.top + da(c) + k.barHeight) + "px; left: " + g.left + "px; width: 2px;"), c.display.lineSpace.appendChild(g), g.scrollIntoView(h), c.display.lineSpace.removeChild(g))))
                }
                h = e.maybeHiddenMarkers;
                g = e.maybeUnhiddenMarkers;
                if (h)for (k = 0; k < h.length; ++k)h[k].lines.length || K(h[k], "hide");
                if (g)for (k = 0; k < g.length; ++k)g[k].lines.length && K(g[k], "unhide");
                d.wrapper.offsetHeight && (f.scrollTop =
                    c.display.scroller.scrollTop);
                e.changeObjs && K(c, "changes", c, e.changeObjs);
                e.update && e.update.finish()
            }
        }
    }

    function T(a, b) {
        if (a.curOp)return b();
        Ja(a);
        try {
            return b()
        } finally {
            La(a)
        }
    }

    function G(a, b) {
        return function () {
            if (a.curOp)return b.apply(a, arguments);
            Ja(a);
            try {
                return b.apply(a, arguments)
            } finally {
                La(a)
            }
        }
    }

    function M(a) {
        return function () {
            if (this.curOp)return a.apply(this, arguments);
            Ja(this);
            try {
                return a.apply(this, arguments)
            } finally {
                La(this)
            }
        }
    }

    function N(a) {
        return function () {
            var b = this.cm;
            if (!b || b.curOp)return a.apply(this,
                arguments);
            Ja(b);
            try {
                return a.apply(this, arguments)
            } finally {
                La(b)
            }
        }
    }

    function ke(a, b, c) {
        for (var d = this.line = b, e; d = Aa(d, !1);)d = d.find(1, !0).line, (e || (e = [])).push(d);
        this.size = (this.rest = e) ? F(A(this.rest)) - c + 1 : 1;
        this.node = this.text = null;
        this.hidden = ya(a, b)
    }

    function Nb(a, b, c) {
        var d = [], e;
        for (e = b; e < c;)b = new ke(a.doc, u(a.doc, e), e), e += b.size, d.push(b);
        return d
    }

    function Q(a, b, c, d) {
        null == b && (b = a.doc.first);
        null == c && (c = a.doc.first + a.doc.size);
        d || (d = 0);
        var e = a.display;
        d && c < e.viewTo && (null == e.updateLineNumbers ||
        e.updateLineNumbers > b) && (e.updateLineNumbers = b);
        a.curOp.viewChanged = !0;
        if (b >= e.viewTo)ra && Mc(a.doc, b) < e.viewTo && qa(a); else if (c <= e.viewFrom)ra && Ld(a.doc, c + d) > e.viewFrom ? qa(a) : (e.viewFrom += d, e.viewTo += d); else if (b <= e.viewFrom && c >= e.viewTo)qa(a); else if (b <= e.viewFrom) {
            var f = dc(a, c, c + d, 1);
            f ? (e.view = e.view.slice(f.index), e.viewFrom = f.lineN, e.viewTo += d) : qa(a)
        } else if (c >= e.viewTo)(f = dc(a, b, b, -1)) ? (e.view = e.view.slice(0, f.index), e.viewTo = f.lineN) : qa(a); else {
            var f = dc(a, b, b, -1), g = dc(a, c, c + d, 1);
            f && g ? (e.view =
                e.view.slice(0, f.index).concat(Nb(a, f.lineN, g.lineN)).concat(e.view.slice(g.index)), e.viewTo += d) : qa(a)
        }
        if (a = e.externalMeasured)c < a.lineN ? a.lineN += d : b < a.lineN + a.size && (e.externalMeasured = null)
    }

    function na(a, b, c) {
        a.curOp.viewChanged = !0;
        var d = a.display, e = a.display.externalMeasured;
        e && b >= e.lineN && b < e.lineN + e.size && (d.externalMeasured = null);
        b < d.viewFrom || b >= d.viewTo || (a = d.view[Ca(a, b)], null != a.node && (a = a.changes || (a.changes = []), -1 == D(a, c) && a.push(c)))
    }

    function qa(a) {
        a.display.viewFrom = a.display.viewTo =
            a.doc.first;
        a.display.view = [];
        a.display.viewOffset = 0
    }

    function Ca(a, b) {
        if (b >= a.display.viewTo)return null;
        b -= a.display.viewFrom;
        if (0 > b)return null;
        for (var c = a.display.view, d = 0; d < c.length; d++)if (b -= c[d].size, 0 > b)return d
    }

    function dc(a, b, c, d) {
        var e = Ca(a, b), f = a.display.view;
        if (!ra || c == a.doc.first + a.doc.size)return {index: e, lineN: c};
        for (var g = 0, h = a.display.viewFrom; g < e; g++)h += f[g].size;
        if (h != b) {
            if (0 < d) {
                if (e == f.length - 1)return null;
                b = h + f[e].size - b;
                e++
            } else b = h - b;
            c += b
        }
        for (; Mc(a.doc, c) != c;) {
            if (e == (0 > d ? 0 : f.length -
                1))return null;
            c += d * f[e - (0 > d ? 1 : 0)].size;
            e += d
        }
        return {index: e, lineN: c}
    }

    function Kd(a) {
        a = a.display.view;
        for (var b = 0, c = 0; c < a.length; c++) {
            var d = a[c];
            d.hidden || d.node && !d.changes || ++b
        }
        return b
    }

    function sf(a) {
        function b() {
            d.activeTouch && (e = setTimeout(function () {
                d.activeTouch = null
            }, 1E3), f = d.activeTouch, f.end = +new Date)
        }

        function c(a, b) {
            if (null == b.left)return !0;
            var c = b.left - a.left, d = b.top - a.top;
            return 400 < c * c + d * d
        }

        var d = a.display;
        v(d.scroller, "mousedown", G(a, pe));
        B && 11 > C ? v(d.scroller, "dblclick", G(a, function (b) {
            if (!ja(a,
                    b)) {
                var c = Ua(a, b);
                !c || hd(a, b, "gutterClick", !0, L) || oa(a.display, b) || (O(b), b = a.findWordAt(c), Ub(a.doc, b.anchor, b.head))
            }
        })) : v(d.scroller, "dblclick", function (b) {
            ja(a, b) || O(b)
        });
        id || v(d.scroller, "contextmenu", function (b) {
            qe(a, b)
        });
        var e, f = {end: 0};
        v(d.scroller, "touchstart", function (a) {
            var b;
            1 != a.touches.length ? b = !1 : (b = a.touches[0], b = 1 >= b.radiusX && 1 >= b.radiusY);
            b || (clearTimeout(e), b = +new Date, d.activeTouch = {
                start: b,
                moved: !1,
                prev: 300 >= b - f.end ? f : null
            }, 1 == a.touches.length && (d.activeTouch.left = a.touches[0].pageX,
                d.activeTouch.top = a.touches[0].pageY))
        });
        v(d.scroller, "touchmove", function () {
            d.activeTouch && (d.activeTouch.moved = !0)
        });
        v(d.scroller, "touchend", function (e) {
            var f = d.activeTouch;
            if (f && !oa(d, e) && null != f.left && !f.moved && 300 > new Date - f.start) {
                var g = a.coordsChar(d.activeTouch, "page"), f = !f.prev || c(f, f.prev) ? new z(g, g) : !f.prev.prev || c(f, f.prev.prev) ? a.findWordAt(g) : new z(r(g.line, 0), w(a.doc, r(g.line + 1, 0)));
                a.setSelection(f.anchor, f.head);
                a.focus();
                O(e)
            }
            b()
        });
        v(d.scroller, "touchcancel", b);
        v(d.scroller, "scroll",
            function () {
                d.scroller.clientHeight && (lb(a, d.scroller.scrollTop), Ma(a, d.scroller.scrollLeft, !0), K(a, "scroll", a))
            });
        v(d.scroller, "mousewheel", function (b) {
            re(a, b)
        });
        v(d.scroller, "DOMMouseScroll", function (b) {
            re(a, b)
        });
        v(d.wrapper, "scroll", function () {
            d.wrapper.scrollTop = d.wrapper.scrollLeft = 0
        });
        d.dragFunctions = {
            simple: function (b) {
                ja(a, b) || jd(b)
            }, start: function (b) {
                if (B && (!a.state.draggingText || 100 > +new Date - se))jd(b); else if (!ja(a, b) && !oa(a.display, b) && (b.dataTransfer.setData("Text", a.getSelection()), b.dataTransfer.setDragImage && !te)) {
                    var c = t("img", null, null, "position: fixed; left: 0; top: 0;");
                    c.src = "\x3d\x3d";
                    ba && (c.width = c.height = 1, a.display.wrapper.appendChild(c), c._top = c.offsetTop);
                    b.dataTransfer.setDragImage(c, 0, 0);
                    ba && c.parentNode.removeChild(c)
                }
            }, drop: G(a, Hf)
        };
        var g = d.input.getField();
        v(g, "keyup", function (b) {
            ue.call(a, b)
        });
        v(g, "keydown", G(a, ve));
        v(g, "keypress", G(a, we));
        v(g, "focus", cb(xc, a));
        v(g, "blur", cb(db, a))
    }

    function If(a) {
        var b = a.display;
        if (b.lastWrapHeight != b.wrapper.clientHeight || b.lastWrapWidth != b.wrapper.clientWidth)b.cachedCharWidth = b.cachedTextHeight = b.cachedPaddingH = null, b.scrollbarsClipped = !1, a.setSize()
    }

    function oa(a, b) {
        for (var c = b.target || b.srcElement; c != a.wrapper; c = c.parentNode)if (!c || 1 == c.nodeType && "true" == c.getAttribute("cm-ignore-events") || c.parentNode == a.sizer && c != a.mover)return !0
    }

    function Ua(a, b, c, d) {
        var e = a.display;
        if (!c && "true" == (b.target || b.srcElement).getAttribute("cm-not-content"))return null;
        var f, g;
        c = e.lineSpace.getBoundingClientRect();
        try {
            f = b.clientX - c.left, g = b.clientY - c.top
        } catch (h) {
            return null
        }
        b = fd(a, f, g);
        var k;
        d && 1 == b.xRel && (k = u(a.doc, b.line).text).length == b.ch && (d = aa(k, k.length, a.options.tabSize) - k.length, b = r(b.line, Math.max(0, Math.round((f - ie(a.display).left) / gb(a.display)) - d)));
        return b
    }

    function pe(a) {
        var b = this.display;
        if (!(b.activeTouch && b.input.supportsTouch() || ja(this, a)))if (b.shift = a.shiftKey, oa(b, a))J || (b.scroller.draggable = !1, setTimeout(function () {
            b.scroller.draggable = !0
        }, 100)); else if (!hd(this, a, "gutterClick", !0,
                L)) {
            var c = Ua(this, a);
            window.focus();
            switch (xe(a)) {
                case 1:
                    c ? Jf(this, a, c) : (a.target || a.srcElement) == b.scroller && O(a);
                    break;
                case 2:
                    J && (this.state.lastMiddleDown = +new Date);
                    c && Ub(this.doc, c);
                    setTimeout(function () {
                        b.input.focus()
                    }, 20);
                    O(a);
                    break;
                case 3:
                    id ? qe(this, a) : Kf(this)
            }
        }
    }

    function Jf(a, b, c) {
        B ? setTimeout(cb(Ud, a), 0) : a.curOp.focus = fa();
        var d = +new Date, e;
        ec && ec.time > d - 400 && 0 == y(ec.pos, c) ? e = "triple" : fc && fc.time > d - 400 && 0 == y(fc.pos, c) ? (e = "double", ec = {
            time: d,
            pos: c
        }) : (e = "single", fc = {time: d, pos: c});
        var d =
            a.doc.sel, f = W ? b.metaKey : b.ctrlKey, g;
        a.options.dragDrop && Lf && !Rb(a) && "single" == e && -1 < (g = d.contains(c)) && !d.ranges[g].empty() ? Mf(a, b, c, f) : Nf(a, b, c, e, f)
    }

    function Mf(a, b, c, d) {
        var e = a.display, f = +new Date, g = G(a, function (h) {
            J && (e.scroller.draggable = !1);
            a.state.draggingText = !1;
            ka(document, "mouseup", g);
            ka(e.scroller, "drop", g);
            10 > Math.abs(b.clientX - h.clientX) + Math.abs(b.clientY - h.clientY) && (O(h), !d && +new Date - 200 < f && Ub(a.doc, c), J || B && 9 == C ? setTimeout(function () {
                document.body.focus();
                e.input.focus()
            }, 20) : e.input.focus())
        });
        J && (e.scroller.draggable = !0);
        a.state.draggingText = g;
        e.scroller.dragDrop && e.scroller.dragDrop();
        v(document, "mouseup", g);
        v(e.scroller, "drop", g)
    }

    function Nf(a, b, c, d, e) {
        function f(b) {
            if (0 != y(x, b))if (x = b, "rect" == d) {
                for (var e = [], f = a.options.tabSize, g = aa(u(l, c.line).text, c.ch, f), h = aa(u(l, b.line).text, b.ch, f), k = Math.min(g, h), g = Math.max(g, h), h = Math.min(c.line, b.line), q = Math.min(a.lastLine(), Math.max(c.line, b.line)); h <= q; h++) {
                    var E = u(l, h).text, t = ye(E, k, f);
                    k == g ? e.push(new z(r(h, t), r(h, t))) : E.length > t && e.push(new z(r(h,
                        t), r(h, ye(E, g, f))))
                }
                e.length || e.push(new z(c, c));
                H(l, Z(n.ranges.slice(0, p).concat(e), p), {origin: "*mouse", scroll: !1});
                a.scrollIntoView(b)
            } else e = m, f = e.anchor, k = b, "single" != d && (b = "double" == d ? a.findWordAt(b) : new z(r(b.line, 0), w(l, r(b.line + 1, 0))), 0 < y(b.anchor, f) ? (k = b.head, f = Qb(e.from(), b.anchor)) : (k = b.anchor, f = Pb(e.to(), b.head))), e = n.ranges.slice(0), e[p] = new z(w(l, f), k), H(l, Z(e, p), kd)
        }

        function g(b) {
            var c = ++A, e = Ua(a, b, !0, "rect" == d);
            if (e)if (0 != y(e, x)) {
                a.curOp.focus = fa();
                f(e);
                var h = Hc(k, l);
                (e.line >= h.to ||
                e.line < h.from) && setTimeout(G(a, function () {
                    A == c && g(b)
                }), 150)
            } else {
                var m = b.clientY < B.top ? -20 : b.clientY > B.bottom ? 20 : 0;
                m && setTimeout(G(a, function () {
                    A == c && (k.scroller.scrollTop += m, g(b))
                }), 50)
            }
        }

        function h(a) {
            A = Infinity;
            O(a);
            k.input.focus();
            ka(document, "mousemove", F);
            ka(document, "mouseup", C);
            l.history.lastSelOrigin = null
        }

        var k = a.display, l = a.doc;
        O(b);
        var m, p, n = l.sel, q = n.ranges;
        e && !b.shiftKey ? (p = l.sel.contains(c), m = -1 < p ? q[p] : new z(c, c)) : (m = l.sel.primary(), p = l.sel.primIndex);
        if (b.altKey)d = "rect", e || (m = new z(c,
            c)), c = Ua(a, b, !0, !0), p = -1; else if ("double" == d) {
            var t = a.findWordAt(c);
            m = a.display.shift || l.extend ? rb(l, m, t.anchor, t.head) : t
        } else"triple" == d ? (t = new z(r(c.line, 0), w(l, r(c.line + 1, 0))), m = a.display.shift || l.extend ? rb(l, m, t.anchor, t.head) : t) : m = rb(l, m, c);
        e ? -1 == p ? (p = q.length, H(l, Z(q.concat([m]), p), {
            scroll: !1,
            origin: "*mouse"
        })) : 1 < q.length && q[p].empty() && "single" == d && !b.shiftKey ? (H(l, Z(q.slice(0, p).concat(q.slice(p + 1)), 0)), n = l.sel) : Xc(l, p, m, kd) : (p = 0, H(l, new la([m], 0), kd), n = l.sel);
        var x = c, B = k.wrapper.getBoundingClientRect(),
            A = 0, F = G(a, function (a) {
                xe(a) ? g(a) : h(a)
            }), C = G(a, h);
        v(document, "mousemove", F);
        v(document, "mouseup", C)
    }

    function hd(a, b, c, d, e) {
        try {
            var f = b.clientX, g = b.clientY
        } catch (h) {
            return !1
        }
        if (f >= Math.floor(a.display.gutters.getBoundingClientRect().right))return !1;
        d && O(b);
        d = a.display;
        var k = d.lineDiv.getBoundingClientRect();
        if (g > k.bottom || !S(a, c))return ld(b);
        g -= k.top - d.viewOffset;
        for (k = 0; k < a.options.gutters.length; ++k) {
            var l = d.gutters.childNodes[k];
            if (l && l.getBoundingClientRect().right >= f)return f = Ba(a.doc, g), e(a,
                c, a, f, a.options.gutters[k], b), ld(b)
        }
    }

    function Hf(a) {
        var b = this;
        if (!ja(b, a) && !oa(b.display, a)) {
            O(a);
            B && (se = +new Date);
            var c = Ua(b, a, !0), d = a.dataTransfer.files;
            if (c && !Rb(b))if (d && d.length && window.FileReader && window.File) {
                var e = d.length, f = Array(e), g = 0;
                a = function (a, d) {
                    var h = new FileReader;
                    h.onload = G(b, function () {
                        f[d] = h.result;
                        if (++g == e) {
                            c = w(b.doc, c);
                            var a = {from: c, to: c, text: sa(f.join("\n")), origin: "paste"};
                            Oa(b.doc, a);
                            be(b.doc, ga(c, ta(a)))
                        }
                    });
                    h.readAsText(a)
                };
                for (var h = 0; h < e; ++h)a(d[h], h)
            } else if (b.state.draggingText &&
                -1 < b.doc.sel.contains(c))b.state.draggingText(a), setTimeout(function () {
                b.display.input.focus()
            }, 20); else try {
                if (f = a.dataTransfer.getData("Text")) {
                    if (b.state.draggingText && (W ? !a.altKey : !a.ctrlKey))var k = b.listSelections();
                    Vb(b.doc, ga(c, c));
                    if (k)for (h = 0; h < k.length; ++h)wb(b.doc, "", k[h].anchor, k[h].head, "drag");
                    b.replaceSelection(f, "around", "paste");
                    b.display.input.focus()
                }
            } catch (l) {
            }
        }
    }

    function lb(a, b) {
        2 > Math.abs(a.doc.scrollTop - b) || (a.doc.scrollTop = b, wa || Pc(a, {top: b}), a.display.scroller.scrollTop != b &&
        (a.display.scroller.scrollTop = b), a.display.scrollbars.setScrollTop(b), wa && Pc(a), fb(a, 100))
    }

    function Ma(a, b, c) {
        (c ? b == a.doc.scrollLeft : 2 > Math.abs(a.doc.scrollLeft - b)) || (b = Math.min(b, a.display.scroller.scrollWidth - a.display.scroller.clientWidth), a.doc.scrollLeft = b, Bc(a), a.display.scroller.scrollLeft != b && (a.display.scroller.scrollLeft = b), a.display.scrollbars.setScrollLeft(b))
    }

    function re(a, b) {
        var c = ze(b), d = c.x, c = c.y, e = a.display, f = e.scroller;
        if (d && f.scrollWidth > f.clientWidth || c && f.scrollHeight > f.clientHeight) {
            if (c &&
                W && J) {
                var g = b.target, h = e.view;
                a:for (; g != f; g = g.parentNode)for (var k = 0; k < h.length; k++)if (h[k].node == g) {
                    a.display.currentWheelTarget = g;
                    break a
                }
            }
            !d || wa || ba || null == R ? (c && null != R && (g = c * R, h = a.doc.scrollTop, k = h + e.wrapper.clientHeight, 0 > g ? h = Math.max(0, h + g - 50) : k = Math.min(a.doc.height, k + g + 50), Pc(a, {
                top: h,
                bottom: k
            })), 20 > gc && (null == e.wheelStartX ? (e.wheelStartX = f.scrollLeft, e.wheelStartY = f.scrollTop, e.wheelDX = d, e.wheelDY = c, setTimeout(function () {
                if (null != e.wheelStartX) {
                    var a = f.scrollLeft - e.wheelStartX, b = f.scrollTop -
                        e.wheelStartY, a = b && e.wheelDY && b / e.wheelDY || a && e.wheelDX && a / e.wheelDX;
                    e.wheelStartX = e.wheelStartY = null;
                    a && (R = (R * gc + a) / (gc + 1), ++gc)
                }
            }, 200)) : (e.wheelDX += d, e.wheelDY += c))) : (c && lb(a, Math.max(0, Math.min(f.scrollTop + c * R, f.scrollHeight - f.clientHeight))), Ma(a, Math.max(0, Math.min(f.scrollLeft + d * R, f.scrollWidth - f.clientWidth))), O(b), e.wheelStartX = null)
        }
    }

    function hc(a, b, c) {
        if ("string" == typeof b && (b = ic[b], !b))return !1;
        a.display.input.ensurePolled();
        var d = a.display.shift, e = !1;
        try {
            Rb(a) && (a.state.suppressEdits = !0), c && (a.display.shift = !1), e = b(a) != Ae
        } finally {
            a.display.shift = d, a.state.suppressEdits = !1
        }
        return e
    }

    function Of(a, b, c) {
        for (var d = 0; d < a.state.keyMaps.length; d++) {
            var e = xb(b, a.state.keyMaps[d], c, a);
            if (e)return e
        }
        return a.options.extraKeys && xb(b, a.options.extraKeys, c, a) || xb(b, a.options.keyMap, c, a)
    }

    function jc(a, b, c, d) {
        var e = a.state.keySeq;
        if (e) {
            if (Pf(b))return "handled";
            Qf.set(50, function () {
                a.state.keySeq == e && (a.state.keySeq = null, a.display.input.reset())
            });
            b = e + " " + b
        }
        d = Of(a, b, d);
        "multi" == d && (a.state.keySeq =
            b);
        "handled" == d && L(a, "keyHandled", a, b, c);
        if ("handled" == d || "multi" == d)O(c), Yc(a);
        return e && !d && /\'$/.test(b) ? (O(c), !0) : !!d
    }

    function Be(a, b) {
        var c = Rf(b, !0);
        return c ? b.shiftKey && !a.state.keySeq ? jc(a, "Shift-" + c, b, function (b) {
            return hc(a, b, !0)
        }) || jc(a, c, b, function (b) {
            if ("string" == typeof b ? /^go[A-Z]/.test(b) : b.motion)return hc(a, b)
        }) : jc(a, c, b, function (b) {
            return hc(a, b)
        }) : !1
    }

    function Sf(a, b, c) {
        return jc(a, "'" + c + "'", b, function (b) {
            return hc(a, b, !0)
        })
    }

    function ve(a) {
        this.curOp.focus = fa();
        if (!ja(this, a)) {
            B &&
            11 > C && 27 == a.keyCode && (a.returnValue = !1);
            var b = a.keyCode;
            this.display.shift = 16 == b || a.shiftKey;
            var c = Be(this, a);
            ba && (md = c ? b : null, !c && 88 == b && !Ce && (W ? a.metaKey : a.ctrlKey) && this.replaceSelection("", null, "cut"));
            18 != b || /\bCodeMirror-crosshair\b/.test(this.display.lineDiv.className) || Tf(this)
        }
    }

    function Tf(a) {
        function b(a) {
            18 != a.keyCode && a.altKey || (kb(c, "CodeMirror-crosshair"), ka(document, "keyup", b), ka(document, "mouseover", b))
        }

        var c = a.display.lineDiv;
        mb(c, "CodeMirror-crosshair");
        v(document, "keyup", b);
        v(document,
            "mouseover", b)
    }

    function ue(a) {
        16 == a.keyCode && (this.doc.sel.shift = !1);
        ja(this, a)
    }

    function we(a) {
        if (!(oa(this.display, a) || ja(this, a) || a.ctrlKey && !a.altKey || W && a.metaKey)) {
            var b = a.keyCode, c = a.charCode;
            if (ba && b == md)md = null, O(a); else if (!ba || a.which && !(10 > a.which) || !Be(this, a))if (b = String.fromCharCode(null == c ? b : c), !Sf(this, a, b))this.display.input.onKeyPress(a)
        }
    }

    function Kf(a) {
        a.state.delayingBlurEvent = !0;
        setTimeout(function () {
            a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1, db(a))
        }, 100)
    }

    function xc(a) {
        a.state.delayingBlurEvent &&
        (a.state.delayingBlurEvent = !1);
        "nocursor" != a.options.readOnly && (a.state.focused || (K(a, "focus", a), a.state.focused = !0, mb(a.display.wrapper, "CodeMirror-focused"), a.curOp || a.display.selForContextMenu == a.doc.sel || (a.display.input.reset(), J && setTimeout(function () {
            a.display.input.reset(!0)
        }, 20)), a.display.input.receivedFocus()), Yc(a))
    }

    function db(a) {
        a.state.delayingBlurEvent || (a.state.focused && (K(a, "blur", a), a.state.focused = !1, kb(a.display.wrapper, "CodeMirror-focused")), clearInterval(a.display.blinker),
            setTimeout(function () {
                a.state.focused || (a.display.shift = !1)
            }, 150))
    }

    function qe(a, b) {
        var c;
        (c = oa(a.display, b)) || (c = S(a, "gutterContextMenu") ? hd(a, b, "gutterContextMenu", !1, K) : !1);
        if (!c)a.display.input.onContextMenu(b)
    }

    function De(a, b) {
        if (0 > y(a, b.from))return a;
        if (0 >= y(a, b.to))return ta(b);
        var c = a.line + b.text.length - (b.to.line - b.from.line) - 1, d = a.ch;
        a.line == b.to.line && (d += ta(b).ch - b.to.ch);
        return r(c, d)
    }

    function nd(a, b) {
        for (var c = [], d = 0; d < a.sel.ranges.length; d++) {
            var e = a.sel.ranges[d];
            c.push(new z(De(e.anchor,
                b), De(e.head, b)))
        }
        return Z(c, a.sel.primIndex)
    }

    function Ee(a, b, c) {
        return a.line == b.line ? r(c.line, a.ch - b.ch + c.ch) : r(c.line + (a.line - b.line), a.ch)
    }

    function Fe(a, b, c) {
        b = {
            canceled: !1, from: b.from, to: b.to, text: b.text, origin: b.origin, cancel: function () {
                this.canceled = !0
            }
        };
        c && (b.update = function (b, c, f, g) {
            b && (this.from = w(a, b));
            c && (this.to = w(a, c));
            f && (this.text = f);
            void 0 !== g && (this.origin = g)
        });
        K(a, "beforeChange", a, b);
        a.cm && K(a.cm, "beforeChange", a.cm, b);
        return b.canceled ? null : {from: b.from, to: b.to, text: b.text, origin: b.origin}
    }

    function Oa(a, b, c) {
        if (a.cm) {
            if (!a.cm.curOp)return G(a.cm, Oa)(a, b, c);
            if (a.cm.state.suppressEdits)return
        }
        if (S(a, "beforeChange") || a.cm && S(a.cm, "beforeChange"))if (b = Fe(a, b, !0), !b)return;
        if (c = Ge && !c && Uf(a, b.from, b.to))for (var d = c.length - 1; 0 <= d; --d)He(a, {
            from: c[d].from,
            to: c[d].to,
            text: d ? [""] : b.text
        }); else He(a, b)
    }

    function He(a, b) {
        if (1 != b.text.length || "" != b.text[0] || 0 != y(b.from, b.to)) {
            var c = nd(a, b);
            Ie(a, b, c, a.cm ? a.cm.curOp.id : NaN);
            yb(a, b, c, od(a, b));
            var d = [];
            Ga(a, function (a, c) {
                c || -1 != D(d, a.history) || (Je(a.history,
                    b), d.push(a.history));
                yb(a, b, null, od(a, b))
            })
        }
    }

    function kc(a, b, c) {
        if (!a.cm || !a.cm.state.suppressEdits) {
            for (var d = a.history, e, f = a.sel, g = "undo" == b ? d.done : d.undone, h = "undo" == b ? d.undone : d.done, k = 0; k < g.length && (e = g[k], c ? !e.ranges || e.equals(a.sel) : e.ranges); k++);
            if (k != g.length) {
                for (d.lastOrigin = d.lastSelOrigin = null; ;)if (e = g.pop(), e.ranges) {
                    Wb(e, h);
                    if (c && !e.equals(a.sel)) {
                        H(a, e, {clearRedo: !1});
                        return
                    }
                    f = e
                } else break;
                c = [];
                Wb(f, h);
                h.push({changes: c, generation: d.generation});
                d.generation = e.generation || ++d.maxGeneration;
                d = S(a, "beforeChange") || a.cm && S(a.cm, "beforeChange");
                for (k = e.changes.length - 1; 0 <= k; --k) {
                    var l = e.changes[k];
                    l.origin = b;
                    if (d && !Fe(a, l, !1)) {
                        g.length = 0;
                        break
                    }
                    c.push(pd(a, l));
                    f = k ? nd(a, l) : A(g);
                    yb(a, l, f, Ke(a, l));
                    !k && a.cm && a.cm.scrollIntoView({from: l.from, to: ta(l)});
                    var m = [];
                    Ga(a, function (a, b) {
                        b || -1 != D(m, a.history) || (Je(a.history, l), m.push(a.history));
                        yb(a, l, null, Ke(a, l))
                    })
                }
            }
        }
    }

    function Le(a, b) {
        if (0 != b && (a.first += b, a.sel = new la(ob(a.sel.ranges, function (a) {
                return new z(r(a.anchor.line + b, a.anchor.ch), r(a.head.line +
                b, a.head.ch))
            }), a.sel.primIndex), a.cm)) {
            Q(a.cm, a.first, a.first - b, b);
            for (var c = a.cm.display, d = c.viewFrom; d < c.viewTo; d++)na(a.cm, d, "gutter")
        }
    }

    function yb(a, b, c, d) {
        if (a.cm && !a.cm.curOp)return G(a.cm, yb)(a, b, c, d);
        if (b.to.line < a.first)Le(a, b.text.length - 1 - (b.to.line - b.from.line)); else if (!(b.from.line > a.lastLine())) {
            if (b.from.line < a.first) {
                var e = b.text.length - 1 - (a.first - b.from.line);
                Le(a, e);
                b = {from: r(a.first, 0), to: r(b.to.line + e, b.to.ch), text: [A(b.text)], origin: b.origin}
            }
            e = a.lastLine();
            b.to.line > e && (b =
            {from: b.from, to: r(e, u(a, e).text.length), text: [b.text[0]], origin: b.origin});
            b.removed = Da(a, b.from, b.to);
            c || (c = nd(a, b));
            a.cm ? Vf(a.cm, b, d) : qd(a, b, d);
            Vb(a, c, ha)
        }
    }

    function Vf(a, b, c) {
        var d = a.doc, e = a.display, f = b.from, g = b.to, h = !1, k = f.line;
        a.options.lineWrapping || (k = F(ia(u(d, f.line))), d.iter(k, g.line + 1, function (a) {
            if (a == e.maxLine)return h = !0
        }));
        -1 < d.sel.contains(b.from, b.to) && fe(a);
        qd(d, b, c, Id(a));
        a.options.lineWrapping || (d.iter(k, f.line + b.text.length, function (a) {
            var b = Kb(a);
            b > e.maxLineLength && (e.maxLine =
                a, e.maxLineLength = b, e.maxLineChanged = !0, h = !1)
        }), h && (a.curOp.updateMaxLine = !0));
        d.frontier = Math.min(d.frontier, f.line);
        fb(a, 400);
        c = b.text.length - (g.line - f.line) - 1;
        b.full ? Q(a) : f.line != g.line || 1 != b.text.length || Me(a.doc, b) ? Q(a, f.line, g.line + 1, c) : na(a, f.line, "text");
        c = S(a, "changes");
        if ((d = S(a, "change")) || c)b = {
            from: f,
            to: g,
            text: b.text,
            removed: b.removed,
            origin: b.origin
        }, d && L(a, "change", a, b), c && (a.curOp.changeObjs || (a.curOp.changeObjs = [])).push(b);
        a.display.selForContextMenu = null
    }

    function wb(a, b, c, d, e) {
        d ||
        (d = c);
        if (0 > y(d, c)) {
            var f = d;
            d = c;
            c = f
        }
        "string" == typeof b && (b = sa(b));
        Oa(a, {from: c, to: d, text: b, origin: e})
    }

    function cc(a, b, c, d, e) {
        var f = a.display, g = xa(a.display);
        0 > c && (c = 0);
        var h = a.curOp && null != a.curOp.scrollTop ? a.curOp.scrollTop : f.scroller.scrollTop, k = Nc(a), l = {};
        e - c > k && (e = c + k);
        var m = a.doc.height + Ec(f), p = c < g, g = e > m - g;
        c < h ? l.scrollTop = p ? 0 : c : e > h + k && (c = Math.min(c, (g ? m : e) - k), c != h && (l.scrollTop = c));
        h = a.curOp && null != a.curOp.scrollLeft ? a.curOp.scrollLeft : f.scroller.scrollLeft;
        a = pa(a) - (a.options.fixedGutter ? f.gutters.offsetWidth :
            0);
        (f = d - b > a) && (d = b + a);
        10 > b ? l.scrollLeft = 0 : b < h ? l.scrollLeft = Math.max(0, b - (f ? 0 : 10)) : d > a + h - 3 && (l.scrollLeft = d + (f ? 0 : 10) - a);
        return l
    }

    function lc(a, b, c) {
        null == b && null == c || mc(a);
        null != b && (a.curOp.scrollLeft = (null == a.curOp.scrollLeft ? a.doc.scrollLeft : a.curOp.scrollLeft) + b);
        null != c && (a.curOp.scrollTop = (null == a.curOp.scrollTop ? a.doc.scrollTop : a.curOp.scrollTop) + c)
    }

    function Pa(a) {
        mc(a);
        var b = a.getCursor(), c = b, d = b;
        a.options.lineWrapping || (c = b.ch ? r(b.line, b.ch - 1) : b, d = r(b.line, b.ch + 1));
        a.curOp.scrollToPos = {
            from: c,
            to: d, margin: a.options.cursorScrollMargin, isCursor: !0
        }
    }

    function mc(a) {
        var b = a.curOp.scrollToPos;
        if (b) {
            a.curOp.scrollToPos = null;
            var c = oe(a, b.from), d = oe(a, b.to), b = cc(a, Math.min(c.left, d.left), Math.min(c.top, d.top) - b.margin, Math.max(c.right, d.right), Math.max(c.bottom, d.bottom) + b.margin);
            a.scrollTo(b.scrollLeft, b.scrollTop)
        }
    }

    function pb(a, b, c, d) {
        var e = a.doc, f;
        null == c && (c = "add");
        "smart" == c && (e.mode.indent ? f = sb(a, b) : c = "prev");
        var g = a.options.tabSize, h = u(e, b), k = aa(h.text, null, g);
        h.stateAfter && (h.stateAfter =
            null);
        var l = h.text.match(/^\s*/)[0], m;
        if (!d && !/\S/.test(h.text))m = 0, c = "not"; else if ("smart" == c && (m = e.mode.indent(f, h.text.slice(l.length), h.text), m == Ae || 150 < m)) {
            if (!d)return;
            c = "prev"
        }
        "prev" == c ? m = b > e.first ? aa(u(e, b - 1).text, null, g) : 0 : "add" == c ? m = k + a.options.indentUnit : "subtract" == c ? m = k - a.options.indentUnit : "number" == typeof c && (m = k + c);
        m = Math.max(0, m);
        c = "";
        d = 0;
        if (a.options.indentWithTabs)for (a = Math.floor(m / g); a; --a)d += g, c += "\t";
        d < m && (c += Ne(m - d));
        if (c != l)return wb(e, c, r(b, 0), r(b, l.length), "+input"), h.stateAfter =
            null, !0;
        for (a = 0; a < e.sel.ranges.length; a++)if (g = e.sel.ranges[a], g.head.line == b && g.head.ch < l.length) {
            d = r(b, l.length);
            Xc(e, a, new z(d, d));
            break
        }
    }

    function nc(a, b, c, d) {
        var e = b, f = b;
        "number" == typeof b ? f = u(a, Math.max(a.first, Math.min(b, a.first + a.size - 1))) : e = F(b);
        if (null == e)return null;
        d(f, e) && a.cm && na(a.cm, e, c);
        return f
    }

    function Va(a, b) {
        for (var c = a.doc.sel.ranges, d = [], e = 0; e < c.length; e++) {
            for (var f = b(c[e]); d.length && 0 >= y(f.from, A(d).to);) {
                var g = d.pop();
                if (0 > y(g.from, f.from)) {
                    f.from = g.from;
                    break
                }
            }
            d.push(f)
        }
        T(a,
            function () {
                for (var b = d.length - 1; 0 <= b; b--)wb(a.doc, "", d[b].from, d[b].to, "+delete");
                Pa(a)
            })
    }

    function rd(a, b, c, d, e) {
        function f(b) {
            var d = (e ? gd : Oe)(l, h, c, !0);
            if (null == d) {
                if (b = !b)b = g + c, b < a.first || b >= a.first + a.size ? b = m = !1 : (g = b, b = l = u(a, b));
                if (b)h = e ? (0 > c ? bc : ac)(l) : 0 > c ? l.text.length : 0; else return m = !1
            } else h = d;
            return !0
        }

        var g = b.line, h = b.ch, k = c, l = u(a, g), m = !0;
        if ("char" == d)f(); else if ("column" == d)f(!0); else if ("word" == d || "group" == d) {
            var p = null;
            d = "group" == d;
            b = a.cm && a.cm.getHelper(b, "wordChars");
            for (var n = !0; !(0 >
            c) || f(!n); n = !1) {
                var q = l.text.charAt(h) || "\n", q = oc(q, b) ? "w" : d && "\n" == q ? "n" : !d || /\s/.test(q) ? null : "p";
                !d || n || q || (q = "s");
                if (p && p != q) {
                    0 > c && (c = 1, f());
                    break
                }
                q && (p = q);
                if (0 < c && !f(!n))break
            }
        }
        k = Xb(a, r(g, h), k, !0);
        m || (k.hitSide = !0);
        return k
    }

    function Pe(a, b, c, d) {
        var e = a.doc, f = b.left, g;
        "page" == d ? (g = Math.min(a.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight), g = b.top + c * (g - (0 > c ? 1.5 : .5) * xa(a.display))) : "line" == d && (g = 0 < c ? b.bottom + 3 : b.top - 3);
        for (; ;) {
            b = fd(a, f, g);
            if (!b.outside)break;
            if (0 > c ? 0 >= g : g >= e.height) {
                b.hitSide = !0;
                break
            }
            g += 5 * c
        }
        return b
    }

    function x(a, b, c, d) {
        q.defaults[a] = b;
        c && (Ka[a] = d ? function (a, b, d) {
            d != Fd && c(a, b, d)
        } : c)
    }

    function Wf(a) {
        var b = a.split(/-(?!$)/);
        a = b[b.length - 1];
        for (var c, d, e, f, g = 0; g < b.length - 1; g++) {
            var h = b[g];
            if (/^(cmd|meta|m)$/i.test(h))f = !0; else if (/^a(lt)?$/i.test(h))c = !0; else if (/^(c|ctrl|control)$/i.test(h))d = !0; else if (/^s(hift)$/i.test(h))e = !0; else throw Error("Unrecognized modifier name: " + h);
        }
        c && (a = "Alt-" + a);
        d && (a = "Ctrl-" + a);
        f && (a = "Cmd-" + a);
        e && (a = "Shift-" +
        a);
        return a
    }

    function pc(a) {
        return "string" == typeof a ? ua[a] : a
    }

    function Wa(a, b, c, d, e) {
        if (d && d.shared)return Xf(a, b, c, d, e);
        if (a.cm && !a.cm.curOp)return G(a.cm, Wa)(a, b, c, d, e);
        var f = new Ha(a, e);
        e = y(b, c);
        d && V(d, f, !1);
        if (0 < e || 0 == e && !1 !== f.clearWhenEmpty)return f;
        f.replacedWith && (f.collapsed = !0, f.widgetNode = t("span", [f.replacedWith], "CodeMirror-widget"), d.handleMouseEvents || f.widgetNode.setAttribute("cm-ignore-events", "true"), d.insertLeft && (f.widgetNode.insertLeft = !0));
        if (f.collapsed) {
            if (Qe(a, b.line, b, c, f) ||
                b.line != c.line && Qe(a, c.line, b, c, f))throw Error("Inserting collapsed marker partially overlapping an existing one");
            ra = !0
        }
        f.addToHistory && Ie(a, {from: b, to: c, origin: "markText"}, a.sel, NaN);
        var g = b.line, h = a.cm, k;
        a.iter(g, c.line + 1, function (a) {
            h && f.collapsed && !h.options.lineWrapping && ia(a) == h.display.maxLine && (k = !0);
            f.collapsed && g != b.line && ca(a, 0);
            var d = new qc(f, g == b.line ? b.ch : null, g == c.line ? c.ch : null);
            a.markedSpans = a.markedSpans ? a.markedSpans.concat([d]) : [d];
            d.marker.attachLine(a);
            ++g
        });
        f.collapsed && a.iter(b.line,
            c.line + 1, function (b) {
                ya(a, b) && ca(b, 0)
            });
        f.clearOnEnter && v(f, "beforeCursorEnter", function () {
            f.clear()
        });
        f.readOnly && (Ge = !0, (a.history.done.length || a.history.undone.length) && a.clearHistory());
        f.collapsed && (f.id = ++sd, f.atomic = !0);
        if (h) {
            k && (h.curOp.updateMaxLine = !0);
            if (f.collapsed)Q(h, b.line, c.line + 1); else if (f.className || f.title || f.startStyle || f.endStyle || f.css)for (d = b.line; d <= c.line; d++)na(h, d, "text");
            f.atomic && ge(h.doc);
            L(h, "markerAdded", h, f)
        }
        return f
    }

    function Xf(a, b, c, d, e) {
        d = V(d);
        d.shared = !1;
        var f =
            [Wa(a, b, c, d, e)], g = f[0], h = d.widgetNode;
        Ga(a, function (a) {
            h && (d.widgetNode = h.cloneNode(!0));
            f.push(Wa(a, w(a, b), w(a, c), d, e));
            for (var l = 0; l < a.linked.length; ++l)if (a.linked[l].isParent)return;
            g = A(f)
        });
        return new rc(f, g)
    }

    function Re(a) {
        return a.findMarks(r(a.first, 0), a.clipPos(r(a.lastLine())), function (a) {
            return a.parent
        })
    }

    function Yf(a) {
        for (var b = 0; b < a.length; b++) {
            var c = a[b], d = [c.primary.doc];
            Ga(c.primary.doc, function (a) {
                d.push(a)
            });
            for (var e = 0; e < c.markers.length; e++) {
                var f = c.markers[e];
                -1 == D(d, f.doc) &&
                (f.parent = null, c.markers.splice(e--, 1))
            }
        }
    }

    function qc(a, b, c) {
        this.marker = a;
        this.from = b;
        this.to = c
    }

    function zb(a, b) {
        if (a)for (var c = 0; c < a.length; ++c) {
            var d = a[c];
            if (d.marker == b)return d
        }
    }

    function od(a, b) {
        if (b.full)return null;
        var c = qb(a, b.from.line) && u(a, b.from.line).markedSpans, d = qb(a, b.to.line) && u(a, b.to.line).markedSpans;
        if (!c && !d)return null;
        var e = b.from.ch, f = b.to.ch, g = 0 == y(b.from, b.to);
        if (c)for (var h = 0, k; h < c.length; ++h) {
            var l = c[h], m = l.marker;
            if (null == l.from || (m.inclusiveLeft ? l.from <= e : l.from < e) || !(l.from != e || "bookmark" != m.type || g && l.marker.insertLeft)) {
                var p = null == l.to || (m.inclusiveRight ? l.to >= e : l.to > e);
                (k || (k = [])).push(new qc(m, l.from, p ? null : l.to))
            }
        }
        c = k;
        if (d)for (var h = 0, n; h < d.length; ++h)if (k = d[h], l = k.marker, null == k.to || (l.inclusiveRight ? k.to >= f : k.to > f) || k.from == f && "bookmark" == l.type && (!g || k.marker.insertLeft))m = null == k.from || (l.inclusiveLeft ? k.from <= f : k.from < f), (n || (n = [])).push(new qc(l, m ? null : k.from - f, null == k.to ? null : k.to - f));
        d = n;
        g = 1 == b.text.length;
        n = A(b.text).length + (g ? e : 0);
        if (c)for (f =
                       0; f < c.length; ++f)if (h = c[f], null == h.to)(k = zb(d, h.marker), k) ? g && (h.to = null == k.to ? null : k.to + n) : h.to = e;
        if (d)for (f = 0; f < d.length; ++f)h = d[f], null != h.to && (h.to += n), null == h.from ? (k = zb(c, h.marker), k || (h.from = n, g && (c || (c = [])).push(h))) : (h.from += n, g && (c || (c = [])).push(h));
        c && (c = Se(c));
        d && d != c && (d = Se(d));
        e = [c];
        if (!g) {
            var g = b.text.length - 2, q;
            if (0 < g && c)for (f = 0; f < c.length; ++f)null == c[f].to && (q || (q = [])).push(new qc(c[f].marker, null, null));
            for (f = 0; f < g; ++f)e.push(q);
            e.push(d)
        }
        return e
    }

    function Se(a) {
        for (var b = 0; b < a.length; ++b) {
            var c =
                a[b];
            null != c.from && c.from == c.to && !1 !== c.marker.clearWhenEmpty && a.splice(b--, 1)
        }
        return a.length ? a : null
    }

    function Ke(a, b) {
        var c;
        if (c = b["spans_" + a.id]) {
            for (var d = 0, e = []; d < b.text.length; ++d)e.push(Zf(c[d]));
            c = e
        } else c = null;
        d = od(a, b);
        if (!c)return d;
        if (!d)return c;
        for (e = 0; e < c.length; ++e) {
            var f = c[e], g = d[e];
            if (f && g) {
                var h = 0;
                a:for (; h < g.length; ++h) {
                    for (var k = g[h], l = 0; l < f.length; ++l)if (f[l].marker == k.marker)continue a;
                    f.push(k)
                }
            } else g && (c[e] = g)
        }
        return c
    }

    function Uf(a, b, c) {
        var d = null;
        a.iter(b.line, c.line + 1, function (a) {
            if (a.markedSpans)for (var b =
                0; b < a.markedSpans.length; ++b) {
                var c = a.markedSpans[b].marker;
                !c.readOnly || d && -1 != D(d, c) || (d || (d = [])).push(c)
            }
        });
        if (!d)return null;
        a = [{from: b, to: c}];
        for (b = 0; b < d.length; ++b) {
            c = d[b];
            for (var e = c.find(0), f = 0; f < a.length; ++f) {
                var g = a[f];
                if (!(0 > y(g.to, e.from) || 0 < y(g.from, e.to))) {
                    var h = [f, 1], k = y(g.from, e.from), l = y(g.to, e.to);
                    (0 > k || !c.inclusiveLeft && !k) && h.push({from: g.from, to: e.from});
                    (0 < l || !c.inclusiveRight && !l) && h.push({from: e.to, to: g.to});
                    a.splice.apply(a, h);
                    f += h.length - 1
                }
            }
        }
        return a
    }

    function Te(a) {
        var b =
            a.markedSpans;
        if (b) {
            for (var c = 0; c < b.length; ++c)b[c].marker.detachLine(a);
            a.markedSpans = null
        }
    }

    function Ue(a, b) {
        if (b) {
            for (var c = 0; c < b.length; ++c)b[c].marker.attachLine(a);
            a.markedSpans = b
        }
    }

    function Ve(a, b) {
        var c = a.lines.length - b.lines.length;
        if (0 != c)return c;
        var c = a.find(), d = b.find(), e = y(c.from, d.from) || (a.inclusiveLeft ? -1 : 0) - (b.inclusiveLeft ? -1 : 0);
        return e ? -e : (c = y(c.to, d.to) || (a.inclusiveRight ? 1 : 0) - (b.inclusiveRight ? 1 : 0)) ? c : b.id - a.id
    }

    function Aa(a, b) {
        var c = ra && a.markedSpans, d;
        if (c)for (var e, f = 0; f < c.length; ++f)e =
            c[f], e.marker.collapsed && null == (b ? e.from : e.to) && (!d || 0 > Ve(d, e.marker)) && (d = e.marker);
        return d
    }

    function Qe(a, b, c, d, e) {
        a = u(a, b);
        if (a = ra && a.markedSpans)for (b = 0; b < a.length; ++b) {
            var f = a[b];
            if (f.marker.collapsed) {
                var g = f.marker.find(0), h = y(g.from, c) || (f.marker.inclusiveLeft ? -1 : 0) - (e.inclusiveLeft ? -1 : 0), k = y(g.to, d) || (f.marker.inclusiveRight ? 1 : 0) - (e.inclusiveRight ? 1 : 0);
                if (!(0 <= h && 0 >= k || 0 >= h && 0 <= k) && (0 >= h && (0 < y(g.to, c) || f.marker.inclusiveRight && e.inclusiveLeft) || 0 <= h && (0 > y(g.from, d) || f.marker.inclusiveLeft &&
                    e.inclusiveRight)))return !0
            }
        }
    }

    function ia(a) {
        for (var b; b = Aa(a, !0);)a = b.find(-1, !0).line;
        return a
    }

    function Mc(a, b) {
        var c = u(a, b), d = ia(c);
        return c == d ? b : F(d)
    }

    function Ld(a, b) {
        if (b > a.lastLine())return b;
        var c = u(a, b), d;
        if (!ya(a, c))return b;
        for (; d = Aa(c, !1);)c = d.find(1, !0).line;
        return F(c) + 1
    }

    function ya(a, b) {
        var c = ra && b.markedSpans;
        if (c)for (var d, e = 0; e < c.length; ++e)if (d = c[e], d.marker.collapsed && (null == d.from || !d.marker.widgetNode && 0 == d.from && d.marker.inclusiveLeft && td(a, b, d)))return !0
    }

    function td(a, b, c) {
        if (null ==
            c.to)return b = c.marker.find(1, !0), td(a, b.line, zb(b.line.markedSpans, c.marker));
        if (c.marker.inclusiveRight && c.to == b.text.length)return !0;
        for (var d, e = 0; e < b.markedSpans.length; ++e)if (d = b.markedSpans[e], d.marker.collapsed && !d.marker.widgetNode && d.from == c.to && (null == d.to || d.to != c.from) && (d.marker.inclusiveLeft || c.marker.inclusiveRight) && td(a, b, d))return !0
    }

    function ub(a) {
        if (null != a.height)return a.height;
        var b = a.doc.cm;
        if (!b)return 0;
        if (!Wc(document.body, a.node)) {
            var c = "position: relative;";
            a.coverGutter &&
            (c += "margin-left: -" + b.display.gutters.offsetWidth + "px;");
            a.noHScroll && (c += "width: " + b.display.wrapper.clientWidth + "px;");
            U(b.display.measure, t("div", [a.node], null, c))
        }
        return a.height = a.node.offsetHeight
    }

    function $f(a, b, c, d) {
        var e = new sc(a, c, d), f = a.cm;
        f && e.noHScroll && (f.display.alignWidgets = !0);
        nc(a, b, "widget", function (b) {
            var c = b.widgets || (b.widgets = []);
            null == e.insertAt ? c.push(e) : c.splice(Math.min(c.length - 1, Math.max(0, e.insertAt)), 0, e);
            e.line = b;
            f && !ya(a, b) && (c = ea(b) < a.scrollTop, ca(b, b.height + ub(e)),
            c && lc(f, null, e.height), f.curOp.forceUpdate = !0);
            return !0
        });
        return e
    }

    function We(a, b) {
        if (a)for (; ;) {
            var c = a.match(/(?:^|\s+)line-(background-)?(\S+)/);
            if (!c)break;
            a = a.slice(0, c.index) + a.slice(c.index + c[0].length);
            var d = c[1] ? "bgClass" : "textClass";
            null == b[d] ? b[d] = c[2] : (new RegExp("(?:^|s)" + c[2] + "(?:$|s)")).test(b[d]) || (b[d] += " " + c[2])
        }
        return a
    }

    function Xe(a, b) {
        if (a.blankLine)return a.blankLine(b);
        if (a.innerMode) {
            var c = q.innerMode(a, b);
            if (c.mode.blankLine)return c.mode.blankLine(c.state)
        }
    }

    function ud(a,
                b, c, d) {
        for (var e = 0; 10 > e; e++) {
            d && (d[0] = q.innerMode(a, c).mode);
            var f = a.token(b, c);
            if (b.pos > b.start)return f
        }
        throw Error("Mode " + a.name + " failed to advance stream.");
    }

    function Ye(a, b, c, d) {
        function e(a) {
            return {start: m.start, end: m.pos, string: m.current(), type: h || null, state: a ? Sa(f.mode, l) : l}
        }

        var f = a.doc, g = f.mode, h;
        b = w(f, b);
        var k = u(f, b.line), l = sb(a, b.line, c), m = new tc(k.text, a.options.tabSize), p;
        for (d && (p = []); (d || m.pos < b.ch) && !m.eol();)m.start = m.pos, h = ud(g, m, l), d && p.push(e(!0));
        return d ? p : e()
    }

    function Ze(a,
                b, c, d, e, f, g) {
        var h = c.flattenSpans;
        null == h && (h = a.options.flattenSpans);
        var k = 0, l = null, m = new tc(b, a.options.tabSize), p, n = a.options.addModeClass && [null];
        for ("" == b && We(Xe(c, d), f); !m.eol();) {
            m.pos > a.options.maxHighlightLength ? (h = !1, g && Zc(a, b, d, m.pos), m.pos = b.length, p = null) : p = We(ud(c, m, d, n), f);
            if (n) {
                var q = n[0].name;
                q && (p = "m-" + (p ? q + " " + p : q))
            }
            if (!h || l != p) {
                for (; k < m.start;)k = Math.min(m.start, k + 5E4), e(k, l);
                l = p
            }
            m.start = m.pos
        }
        for (; k < m.pos;)a = Math.min(m.pos, k + 5E4), e(a, l), k = a
    }

    function je(a, b, c, d) {
        var e = [a.state.modeGen],
            f = {};
        Ze(a, b.text, a.doc.mode, c, function (a, b) {
            e.push(a, b)
        }, f, d);
        for (c = 0; c < a.state.overlays.length; ++c) {
            var g = a.state.overlays[c], h = 1, k = 0;
            Ze(a, b.text, g.mode, !0, function (a, b) {
                for (var c = h; k < a;) {
                    var d = e[h];
                    d > a && e.splice(h, 1, a, e[h + 1], d);
                    h += 2;
                    k = Math.min(a, d)
                }
                if (b)if (g.opaque)e.splice(c, h - c, a, "cm-overlay " + b), h = c + 2; else for (; c < h; c += 2)d = e[c + 1], e[c + 1] = (d ? d + " " : "") + "cm-overlay " + b
            }, f)
        }
        return {styles: e, classes: f.bgClass || f.textClass ? f : null}
    }

    function $e(a, b, c) {
        if (!b.styles || b.styles[0] != a.state.modeGen) {
            var d = je(a,
                b, b.stateAfter = sb(a, F(b)));
            b.styles = d.styles;
            d.classes ? b.styleClasses = d.classes : b.styleClasses && (b.styleClasses = null);
            c === a.doc.frontier && a.doc.frontier++
        }
        return b.styles
    }

    function Zc(a, b, c, d) {
        var e = a.doc.mode, f = new tc(b, a.options.tabSize);
        f.start = f.pos = d || 0;
        for ("" == b && Xe(e, c); !f.eol() && f.pos <= a.options.maxHighlightLength;)ud(e, f, c), f.start = f.pos
    }

    function af(a, b) {
        if (!a || /^\s*$/.test(a))return null;
        var c = b.addModeClass ? ag : bg;
        return c[a] || (c[a] = a.replace(/\S+/g, "cm-$\x26"))
    }

    function Sd(a, b) {
        var c = t("span",
            null, null, J ? "padding-right: .1px" : null), c = {
            pre: t("pre", [c]),
            content: c,
            col: 0,
            pos: 0,
            cm: a,
            splitSpaces: (B || J) && a.getOption("lineWrapping")
        };
        b.measure = {};
        for (var d = 0; d <= (b.rest ? b.rest.length : 0); d++) {
            var e = d ? b.rest[d - 1] : b.line, f;
            c.pos = 0;
            c.addToken = cg;
            var g;
            if (null != vd)g = vd; else {
                g = U(a.display.measure, document.createTextNode("AخA"));
                var h = Ea(g, 0, 1).getBoundingClientRect();
                g = h && h.left != h.right ? vd = 3 > Ea(g, 1, 2).getBoundingClientRect().right - h.right : !1
            }
            g && (f = Y(e)) && (c.addToken = dg(c.addToken, f));
            c.map = [];
            h = b !=
            a.display.externalMeasured && F(e);
            a:{
                g = c;
                var h = $e(a, e, h), k = e.markedSpans, l = e.text, m = 0;
                if (k)for (var p = l.length, n = 0, q = 1, r = "", u = void 0, v = void 0, w = 0, x = void 0, y = void 0, A = void 0, C = void 0, z = void 0; ;) {
                    if (w == n) {
                        for (var x = y = A = C = v = "", z = null, w = Infinity, G = [], H = 0; H < k.length; ++H) {
                            var I = k[H], D = I.marker;
                            "bookmark" == D.type && I.from == n && D.widgetNode ? G.push(D) : I.from <= n && (null == I.to || I.to > n || D.collapsed && I.to == n && I.from == n) ? (null != I.to && I.to != n && w > I.to && (w = I.to, y = ""), D.className && (x += " " + D.className), D.css && (v = D.css),
                            D.startStyle && I.from == n && (A += " " + D.startStyle), D.endStyle && I.to == w && (y += " " + D.endStyle), D.title && !C && (C = D.title), D.collapsed && (!z || 0 > Ve(z.marker, D)) && (z = I)) : I.from > n && w > I.from && (w = I.from)
                        }
                        if (z && (z.from || 0) == n) {
                            bf(g, (null == z.to ? p + 1 : z.to) - n, z.marker, null == z.from);
                            if (null == z.to)break a;
                            z.to == n && (z = !1)
                        }
                        if (!z && G.length)for (H = 0; H < G.length; ++H)bf(g, 0, G[H])
                    }
                    if (n >= p)break;
                    for (G = Math.min(p, w); ;) {
                        if (r) {
                            H = n + r.length;
                            z || (I = H > G ? r.slice(0, G - n) : r, g.addToken(g, I, u ? u + x : x, A, n + I.length == w ? y : "", C, v));
                            if (H >= G) {
                                r = r.slice(G -
                                n);
                                n = G;
                                break
                            }
                            n = H;
                            A = ""
                        }
                        r = l.slice(m, m = h[q++]);
                        u = af(h[q++], g.cm.options)
                    }
                } else for (var q = 1; q < h.length; q += 2)g.addToken(g, l.slice(m, m = h[q]), af(h[q + 1], g.cm.options))
            }
            e.styleClasses && (e.styleClasses.bgClass && (c.bgClass = wd(e.styleClasses.bgClass, c.bgClass || "")), e.styleClasses.textClass && (c.textClass = wd(e.styleClasses.textClass, c.textClass || "")));
            0 == c.map.length && c.map.push(0, 0, c.content.appendChild(eg(a.display.measure)));
            0 == d ? (b.measure.map = c.map, b.measure.cache = {}) : ((b.measure.maps || (b.measure.maps = [])).push(c.map),
                (b.measure.caches || (b.measure.caches = [])).push({}))
        }
        J && /\bcm-tab\b/.test(c.content.lastChild.className) && (c.content.className = "cm-tab-wrap-hack");
        K(a, "renderLine", a, b.line, c.pre);
        c.pre.className && (c.textClass = wd(c.pre.className, c.textClass || ""));
        return c
    }

    function cg(a, b, c, d, e, f, g) {
        if (b) {
            var h = a.splitSpaces ? b.replace(/ {3,}/g, fg) : b, k = a.cm.state.specialChars, l = !1;
            if (k.test(b))for (var m = document.createDocumentFragment(), p = 0; ;) {
                k.lastIndex = p;
                var n = k.exec(b), q = n ? n.index - p : b.length - p;
                if (q) {
                    var r = document.createTextNode(h.slice(p,
                        p + q));
                    B && 9 > C ? m.appendChild(t("span", [r])) : m.appendChild(r);
                    a.map.push(a.pos, a.pos + q, r);
                    a.col += q;
                    a.pos += q
                }
                if (!n)break;
                p += q + 1;
                "\t" == n[0] ? (r = a.cm.options.tabSize, n = r - a.col % r, r = m.appendChild(t("span", Ne(n), "cm-tab")), r.setAttribute("role", "presentation"), r.setAttribute("cm-text", "\t"), a.col += n) : (r = a.cm.options.specialCharPlaceholder(n[0]), r.setAttribute("cm-text", n[0]), B && 9 > C ? m.appendChild(t("span", [r])) : m.appendChild(r), a.col += 1);
                a.map.push(a.pos, a.pos + 1, r);
                a.pos++
            } else {
                a.col += b.length;
                var m = document.createTextNode(h);
                a.map.push(a.pos, a.pos + b.length, m);
                B && 9 > C && (l = !0);
                a.pos += b.length
            }
            if (c || d || e || l || g)return b = c || "", d && (b += d), e && (b += e), d = t("span", [m], b, g), f && (d.title = f), a.content.appendChild(d);
            a.content.appendChild(m)
        }
    }

    function fg(a) {
        for (var b = " ", c = 0; c < a.length - 2; ++c)b += c % 2 ? " " : " ";
        return b + " "
    }

    function dg(a, b) {
        return function (c, d, e, f, g, h, k) {
            e = e ? e + " cm-force-border" : "cm-force-border";
            for (var l = c.pos, m = l + d.length; ;) {
                for (var p = 0; p < b.length; p++) {
                    var n = b[p];
                    if (n.to > l && n.from <= l)break
                }
                if (n.to >= m)return a(c, d, e, f, g,
                    h, k);
                a(c, d.slice(0, n.to - l), e, f, null, h, k);
                f = null;
                d = d.slice(n.to - l);
                l = n.to
            }
        }
    }

    function bf(a, b, c, d) {
        var e = !d && c.widgetNode;
        e && a.map.push(a.pos, a.pos + b, e);
        !d && a.cm.display.input.needsContentAttribute && (e || (e = a.content.appendChild(document.createElement("span"))), e.setAttribute("cm-marker", c.id));
        e && (a.cm.display.input.setUneditable(e), a.content.appendChild(e));
        a.pos += b
    }

    function Me(a, b) {
        return 0 == b.from.ch && 0 == b.to.ch && "" == A(b.text) && (!a.cm || a.cm.options.wholeLineUpdateBefore)
    }

    function qd(a, b, c, d) {
        function e(a,
                   c, e) {
            a.text = c;
            a.stateAfter && (a.stateAfter = null);
            a.styles && (a.styles = null);
            null != a.order && (a.order = null);
            Te(a);
            Ue(a, e);
            c = d ? d(a) : 1;
            c != a.height && ca(a, c);
            L(a, "change", a, b)
        }

        function f(a, b) {
            for (var e = a, f = []; e < b; ++e)f.push(new Ab(k[e], c ? c[e] : null, d));
            return f
        }

        var g = b.from, h = b.to, k = b.text, l = u(a, g.line), m = u(a, h.line), p = A(k), n = c ? c[k.length - 1] : null, q = h.line - g.line;
        if (b.full)a.insert(0, f(0, k.length)), a.remove(k.length, a.size - k.length); else if (Me(a, b)) {
            var r = f(0, k.length - 1);
            e(m, m.text, n);
            q && a.remove(g.line, q);
            r.length && a.insert(g.line, r)
        } else l == m ? 1 == k.length ? e(l, l.text.slice(0, g.ch) + p + l.text.slice(h.ch), n) : (r = f(1, k.length - 1), r.push(new Ab(p + l.text.slice(h.ch), n, d)), e(l, l.text.slice(0, g.ch) + k[0], c ? c[0] : null), a.insert(g.line + 1, r)) : 1 == k.length ? (e(l, l.text.slice(0, g.ch) + k[0] + m.text.slice(h.ch), c ? c[0] : null), a.remove(g.line + 1, q)) : (e(l, l.text.slice(0, g.ch) + k[0], c ? c[0] : null), e(m, p + m.text.slice(h.ch), n), r = f(1, k.length - 1), 1 < q && a.remove(g.line + 1, q - 1), a.insert(g.line + 1, r));
        L(a, "change", a, b)
    }

    function Bb(a) {
        this.lines =
            a;
        this.parent = null;
        for (var b = 0, c = 0; b < a.length; ++b)a[b].parent = this, c += a[b].height;
        this.height = c
    }

    function Cb(a) {
        this.children = a;
        for (var b = 0, c = 0, d = 0; d < a.length; ++d) {
            var e = a[d], b = b + e.chunkSize(), c = c + e.height;
            e.parent = this
        }
        this.size = b;
        this.height = c;
        this.parent = null
    }

    function Ga(a, b, c) {
        function d(a, f, g) {
            if (a.linked)for (var h = 0; h < a.linked.length; ++h) {
                var k = a.linked[h];
                if (k.doc != f) {
                    var l = g && k.sharedHist;
                    if (!c || l)b(k.doc, l), d(k.doc, a, l)
                }
            }
        }

        d(a, null, !0)
    }

    function Ed(a, b) {
        if (b.cm)throw Error("This document is already in use.");
        a.doc = b;
        b.cm = a;
        Ac(a);
        zc(a);
        a.options.lineWrapping || Dc(a);
        a.options.mode = b.modeOption;
        Q(a)
    }

    function u(a, b) {
        b -= a.first;
        if (0 > b || b >= a.size)throw Error("There is no line " + (b + a.first) + " in the document.");
        for (var c = a; !c.lines;)for (var d = 0; ; ++d) {
            var e = c.children[d], f = e.chunkSize();
            if (b < f) {
                c = e;
                break
            }
            b -= f
        }
        return c.lines[b]
    }

    function Da(a, b, c) {
        var d = [], e = b.line;
        a.iter(b.line, c.line + 1, function (a) {
            a = a.text;
            e == c.line && (a = a.slice(0, c.ch));
            e == b.line && (a = a.slice(b.ch));
            d.push(a);
            ++e
        });
        return d
    }

    function xd(a, b, c) {
        var d =
            [];
        a.iter(b, c, function (a) {
            d.push(a.text)
        });
        return d
    }

    function ca(a, b) {
        var c = b - a.height;
        if (c)for (var d = a; d; d = d.parent)d.height += c
    }

    function F(a) {
        if (null == a.parent)return null;
        var b = a.parent;
        a = D(b.lines, a);
        for (var c = b.parent; c; b = c, c = c.parent)for (var d = 0; c.children[d] != b; ++d)a += c.children[d].chunkSize();
        return a + b.first
    }

    function Ba(a, b) {
        var c = a.first;
        a:do {
            for (var d = 0; d < a.children.length; ++d) {
                var e = a.children[d], f = e.height;
                if (b < f) {
                    a = e;
                    continue a
                }
                b -= f;
                c += e.chunkSize()
            }
            return c
        } while (!a.lines);
        for (d = 0; d <
        a.lines.length; ++d) {
            e = a.lines[d].height;
            if (b < e)break;
            b -= e
        }
        return c + d
    }

    function ea(a) {
        a = ia(a);
        for (var b = 0, c = a.parent, d = 0; d < c.lines.length; ++d) {
            var e = c.lines[d];
            if (e == a)break; else b += e.height
        }
        for (a = c.parent; a; c = a, a = c.parent)for (d = 0; d < a.children.length && (e = a.children[d], e != c); ++d)b += e.height;
        return b
    }

    function Y(a) {
        var b = a.order;
        null == b && (b = a.order = gg(a.text));
        return b
    }

    function uc(a) {
        this.done = [];
        this.undone = [];
        this.undoDepth = Infinity;
        this.lastModTime = this.lastSelTime = 0;
        this.lastOrigin = this.lastSelOrigin =
            this.lastOp = this.lastSelOp = null;
        this.generation = this.maxGeneration = a || 1
    }

    function pd(a, b) {
        var c = {from: Rc(b.from), to: ta(b), text: Da(a, b.from, b.to)};
        cf(a, c, b.from.line, b.to.line + 1);
        Ga(a, function (a) {
            cf(a, c, b.from.line, b.to.line + 1)
        }, !0);
        return c
    }

    function ce(a) {
        for (; a.length;)if (A(a).ranges)a.pop(); else break
    }

    function Ie(a, b, c, d) {
        var e = a.history;
        e.undone.length = 0;
        var f = +new Date, g, h;
        if (h = e.lastOp == d || e.lastOrigin == b.origin && b.origin && ("+" == b.origin.charAt(0) && a.cm && e.lastModTime > f - a.cm.options.historyEventDelay ||
            "*" == b.origin.charAt(0)))e.lastOp == d ? (ce(e.done), g = A(e.done)) : e.done.length && !A(e.done).ranges ? g = A(e.done) : 1 < e.done.length && !e.done[e.done.length - 2].ranges ? (e.done.pop(), g = A(e.done)) : g = void 0, h = g;
        if (h) {
            var k = A(g.changes);
            0 == y(b.from, b.to) && 0 == y(b.from, k.to) ? k.to = ta(b) : g.changes.push(pd(a, b))
        } else for ((g = A(e.done)) && g.ranges || Wb(a.sel, e.done), g = {
            changes: [pd(a, b)],
            generation: e.generation
        }, e.done.push(g); e.done.length > e.undoDepth;)e.done.shift(), e.done[0].ranges || e.done.shift();
        e.done.push(c);
        e.generation = ++e.maxGeneration;
        e.lastModTime = e.lastSelTime = f;
        e.lastOp = e.lastSelOp = d;
        e.lastOrigin = e.lastSelOrigin = b.origin;
        k || K(a, "historyAdded")
    }

    function Wb(a, b) {
        var c = A(b);
        c && c.ranges && c.equals(a) || b.push(a)
    }

    function cf(a, b, c, d) {
        var e = b["spans_" + a.id], f = 0;
        a.iter(Math.max(a.first, c), Math.min(a.first + a.size, d), function (c) {
            c.markedSpans && ((e || (e = b["spans_" + a.id] = {}))[f] = c.markedSpans);
            ++f
        })
    }

    function Zf(a) {
        if (!a)return null;
        for (var b = 0, c; b < a.length; ++b)a[b].marker.explicitlyCleared ? c || (c = a.slice(0, b)) : c && c.push(a[b]);
        return c ? c.length ? c : null : a
    }

    function Xa(a, b, c) {
        for (var d = 0, e = []; d < a.length; ++d) {
            var f = a[d];
            if (f.ranges)e.push(c ? la.prototype.deepCopy.call(f) : f); else {
                var f = f.changes, g = [];
                e.push({changes: g});
                for (var h = 0; h < f.length; ++h) {
                    var k = f[h], l;
                    g.push({from: k.from, to: k.to, text: k.text});
                    if (b)for (var m in k)(l = m.match(/^spans_(\d+)$/)) && -1 < D(b, Number(l[1])) && (A(g)[m] = k[m], delete k[m])
                }
            }
        }
        return e
    }

    function df(a, b, c, d) {
        c < a.line ? a.line += d : b < a.line && (a.line = b, a.ch = 0)
    }

    function ef(a, b, c, d) {
        for (var e = 0; e < a.length; ++e) {
            var f =
                a[e], g = !0;
            if (f.ranges) {
                f.copied || (f = a[e] = f.deepCopy(), f.copied = !0);
                for (var h = 0; h < f.ranges.length; h++)df(f.ranges[h].anchor, b, c, d), df(f.ranges[h].head, b, c, d)
            } else {
                for (h = 0; h < f.changes.length; ++h) {
                    var k = f.changes[h];
                    if (c < k.from.line)k.from = r(k.from.line + d, k.from.ch), k.to = r(k.to.line + d, k.to.ch); else if (b <= k.to.line) {
                        g = !1;
                        break
                    }
                }
                g || (a.splice(0, e + 1), e = 0)
            }
        }
    }

    function Je(a, b) {
        var c = b.from.line, d = b.to.line, e = b.text.length - (d - c) - 1;
        ef(a.done, c, d, e);
        ef(a.undone, c, d, e)
    }

    function ld(a) {
        return null != a.defaultPrevented ?
            a.defaultPrevented : 0 == a.returnValue
    }

    function xe(a) {
        var b = a.which;
        null == b && (a.button & 1 ? b = 1 : a.button & 2 ? b = 3 : a.button & 4 && (b = 2));
        W && a.ctrlKey && 1 == b && (b = 3);
        return b
    }

    function L(a, b) {
        function c(a) {
            return function () {
                a.apply(null, e)
            }
        }

        var d = a._handlers && a._handlers[b];
        if (d) {
            var e = Array.prototype.slice.call(arguments, 2), f;
            Ta ? f = Ta.delayedCallbacks : Db ? f = Db : (f = Db = [], setTimeout(hg, 0));
            for (var g = 0; g < d.length; ++g)f.push(c(d[g]))
        }
    }

    function hg() {
        var a = Db;
        Db = null;
        for (var b = 0; b < a.length; ++b)a[b]()
    }

    function ja(a, b, c) {
        "string" == typeof b && (b = {
            type: b, preventDefault: function () {
                this.defaultPrevented = !0
            }
        });
        K(a, c || b.type, a, b);
        return ld(b) || b.codemirrorIgnore
    }

    function fe(a) {
        var b = a._handlers && a._handlers.cursorActivity;
        if (b) {
            a = a.curOp.cursorActivityHandlers || (a.curOp.cursorActivityHandlers = []);
            for (var c = 0; c < b.length; ++c)-1 == D(a, b[c]) && a.push(b[c])
        }
    }

    function S(a, b) {
        var c = a._handlers && a._handlers[b];
        return c && 0 < c.length
    }

    function Ya(a) {
        a.prototype.on = function (a, c) {
            v(this, a, c)
        };
        a.prototype.off = function (a, c) {
            ka(this, a, c)
        }
    }

    function bb() {
        this.id =
            null
    }

    function ye(a, b, c) {
        for (var d = 0, e = 0; ;) {
            var f = a.indexOf("\t", d);
            -1 == f && (f = a.length);
            var g = f - d;
            if (f == a.length || e + g >= b)return d + Math.min(g, b - e);
            e += f - d;
            e += c - e % c;
            d = f + 1;
            if (e >= b)return d
        }
    }

    function Ne(a) {
        for (; vc.length <= a;)vc.push(A(vc) + " ");
        return vc[a]
    }

    function A(a) {
        return a[a.length - 1]
    }

    function D(a, b) {
        for (var c = 0; c < a.length; ++c)if (a[c] == b)return c;
        return -1
    }

    function ob(a, b) {
        for (var c = [], d = 0; d < a.length; d++)c[d] = b(a[d], d);
        return c
    }

    function Eb() {
    }

    function ff(a, b) {
        var c;
        Object.create ? c = Object.create(a) :
            (Eb.prototype = a, c = new Eb);
        b && V(b, c);
        return c
    }

    function V(a, b, c) {
        b || (b = {});
        for (var d in a)!a.hasOwnProperty(d) || !1 === c && b.hasOwnProperty(d) || (b[d] = a[d]);
        return b
    }

    function cb(a) {
        var b = Array.prototype.slice.call(arguments, 1);
        return function () {
            return a.apply(null, b)
        }
    }

    function oc(a, b) {
        return b ? -1 < b.source.indexOf("\\w") && gf(a) ? !0 : b.test(a) : gf(a)
    }

    function hf(a) {
        for (var b in a)if (a.hasOwnProperty(b) && a[b])return !1;
        return !0
    }

    function tb(a) {
        return 768 <= a.charCodeAt(0) && ig.test(a)
    }

    function t(a, b, c, d) {
        a = document.createElement(a);
        c && (a.className = c);
        d && (a.style.cssText = d);
        if ("string" == typeof b)a.appendChild(document.createTextNode(b)); else if (b)for (c = 0; c < b.length; ++c)a.appendChild(b[c]);
        return a
    }

    function za(a) {
        for (var b = a.childNodes.length; 0 < b; --b)a.removeChild(a.firstChild);
        return a
    }

    function U(a, b) {
        return za(a).appendChild(b)
    }

    function fa() {
        return document.activeElement
    }

    function Fb(a) {
        return new RegExp("(^|\\s)" + a + "(?:$|\\s)\\s*")
    }

    function wd(a, b) {
        for (var c = a.split(" "), d = 0; d < c.length; d++)c[d] && !Fb(c[d]).test(b) && (b += " " + c[d]);
        return b
    }

    function jf(a) {
        if (document.body.getElementsByClassName)for (var b = document.body.getElementsByClassName("CodeMirror"), c = 0; c < b.length; c++) {
            var d = b[c].CodeMirror;
            d && a(d)
        }
    }

    function tf() {
        var a;
        v(window, "resize", function () {
            null == a && (a = setTimeout(function () {
                a = null;
                jf(If)
            }, 100))
        });
        v(window, "blur", function () {
            jf(db)
        })
    }

    function eg(a) {
        if (null == yd) {
            var b = t("span", "​");
            U(a, t("span", [b, document.createTextNode("x")]));
            0 != a.firstChild.offsetHeight && (yd = 1 >= b.offsetWidth && 2 < b.offsetHeight && !(B && 8 > C))
        }
        a = yd ? t("span",
            "​") : t("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px");
        a.setAttribute("cm-text", "");
        return a
    }

    function Af(a, b, c, d) {
        if (!a)return d(b, c, "ltr");
        for (var e = !1, f = 0; f < a.length; ++f) {
            var g = a[f];
            if (g.from < c && g.to > b || b == c && g.to == b)d(Math.max(g.from, b), Math.min(g.to, c), 1 == g.level ? "rtl" : "ltr"), e = !0
        }
        e || d(b, c, "ltr")
    }

    function dd(a) {
        return a.level % 2 ? a.to : a.from
    }

    function ed(a) {
        return a.level % 2 ? a.from : a.to
    }

    function ac(a) {
        return (a = Y(a)) ? dd(a[0]) : 0
    }

    function bc(a) {
        var b = Y(a);
        return b ? ed(A(b)) : a.text.length
    }

    function kf(a, b) {
        var c = u(a.doc, b), d = ia(c);
        d != c && (b = F(d));
        d = (c = Y(d)) ? c[0].level % 2 ? bc(d) : ac(d) : 0;
        return r(b, d)
    }

    function lf(a, b) {
        var c = kf(a, b.line), d = u(a.doc, c.line), e = Y(d);
        return e && 0 != e[0].level ? c : (d = Math.max(0, d.text.search(/\S/)), r(c.line, b.line == c.line && b.ch <= d && b.ch ? 0 : d))
    }

    function Sb(a, b) {
        vb = null;
        for (var c = 0, d; c < a.length; ++c) {
            var e = a[c];
            if (e.from < b && e.to > b)return c;
            if (e.from == b || e.to == b)if (null == d)d = c; else {
                var f;
                f = e.level;
                var g = a[d].level, h = a[0].level;
                f = f == h ? !0 : g == h ? !1 : f < g;
                if (f)return e.from !=
                e.to && (vb = d), c;
                e.from != e.to && (vb = c);
                break
            }
        }
        return d
    }

    function zd(a, b, c, d) {
        if (!d)return b + c;
        do b += c; while (0 < b && tb(a.text.charAt(b)));
        return b
    }

    function gd(a, b, c, d) {
        var e = Y(a);
        if (!e)return Oe(a, b, c, d);
        var f = Sb(e, b), g = e[f];
        for (b = zd(a, b, g.level % 2 ? -c : c, d); ;) {
            if (b > g.from && b < g.to)return b;
            if (b == g.from || b == g.to) {
                if (Sb(e, b) == f)return b;
                g = e[f + c];
                return 0 < c == g.level % 2 ? g.to : g.from
            }
            g = e[f += c];
            if (!g)return null;
            b = 0 < c == g.level % 2 ? zd(a, g.to, -1, d) : zd(a, g.from, 1, d)
        }
    }

    function Oe(a, b, c, d) {
        b += c;
        if (d)for (; 0 < b && tb(a.text.charAt(b));)b +=
            c;
        return 0 > b || b > a.text.length ? null : b
    }

    var wa = /gecko\/\d/i.test(navigator.userAgent), mf = /MSIE \d/.test(navigator.userAgent), nf = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent), B = mf || nf, C = B && (mf ? document.documentMode || 6 : nf[1]), J = /WebKit\//.test(navigator.userAgent), jg = J && /Qt\/\d+\.\d+/.test(navigator.userAgent), kg = /Chrome\//.test(navigator.userAgent), ba = /Opera\//.test(navigator.userAgent), te = /Apple Computer/.test(navigator.vendor), lg = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
        Gf = /PhantomJS/.test(navigator.userAgent), Qa = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent), ab = Qa || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent), W = Qa || /Mac/.test(navigator.platform), mg = /win/i.test(navigator.platform), Ia = ba && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
    Ia && (Ia = Number(Ia[1]));
    Ia && 15 <= Ia && (ba = !1, J = !0);
    var of = W && (jg || ba && (null == Ia || 12.11 > Ia)), id = wa || B && 9 <= C, Ge = !1, ra = !1;
    Fc.prototype = V({
        update: function (a) {
            var b =
                a.scrollWidth > a.clientWidth + 1, c = a.scrollHeight > a.clientHeight + 1, d = a.nativeBarWidth;
            c ? (this.vert.style.display = "block", this.vert.style.bottom = b ? d + "px" : "0", this.vert.firstChild.style.height = Math.max(0, a.scrollHeight - a.clientHeight + (a.viewHeight - (b ? d : 0))) + "px") : (this.vert.style.display = "", this.vert.firstChild.style.height = "0");
            b ? (this.horiz.style.display = "block", this.horiz.style.right = c ? d + "px" : "0", this.horiz.style.left = a.barLeft + "px", this.horiz.firstChild.style.width = a.scrollWidth - a.clientWidth + (a.viewWidth -
            a.barLeft - (c ? d : 0)) + "px") : (this.horiz.style.display = "", this.horiz.firstChild.style.width = "0");
            !this.checkedOverlay && 0 < a.clientHeight && (0 == d && this.overlayHack(), this.checkedOverlay = !0);
            return {right: c ? d : 0, bottom: b ? d : 0}
        }, setScrollLeft: function (a) {
            this.horiz.scrollLeft != a && (this.horiz.scrollLeft = a)
        }, setScrollTop: function (a) {
            this.vert.scrollTop != a && (this.vert.scrollTop = a)
        }, overlayHack: function () {
            this.horiz.style.minHeight = this.vert.style.minWidth = W && !lg ? "12px" : "18px";
            var a = this, b = function (b) {
                (b.target ||
                b.srcElement) != a.vert && (b.target || b.srcElement) != a.horiz && G(a.cm, pe)(b)
            };
            v(this.vert, "mousedown", b);
            v(this.horiz, "mousedown", b)
        }, clear: function () {
            var a = this.horiz.parentNode;
            a.removeChild(this.horiz);
            a.removeChild(this.vert)
        }
    }, Fc.prototype);
    Gc.prototype = V({
        update: function () {
            return {bottom: 0, right: 0}
        }, setScrollLeft: function () {
        }, setScrollTop: function () {
        }, clear: function () {
        }
    }, Gc.prototype);
    q.scrollbarModel = {"native": Fc, "null": Gc};
    Mb.prototype.signal = function (a, b) {
        S(a, b) && this.events.push(arguments)
    };
    Mb.prototype.finish =
        function () {
            for (var a = 0; a < this.events.length; a++)K.apply(null, this.events[a])
        };
    var r = q.Pos = function (a, b) {
        if (!(this instanceof r))return new r(a, b);
        this.line = a;
        this.ch = b
    }, y = q.cmpPos = function (a, b) {
        return a.line - b.line || a.ch - b.ch
    }, X = null;
    Tc.prototype = V({
        init: function (a) {
            function b(a) {
                if (d.somethingSelected())X = d.getSelections(), c.inaccurateSelection && (c.prevInput = "", c.inaccurateSelection = !1, f.value = X.join("\n"), Za(f)); else if (d.options.lineWiseCopyCut) {
                    var b = Vd(d);
                    X = b.text;
                    "cut" == a.type ? d.setSelections(b.ranges,
                        null, ha) : (c.prevInput = "", f.value = b.text.join("\n"), Za(f))
                } else return;
                "cut" == a.type && (d.state.cutIncoming = !0)
            }

            var c = this, d = this.cm, e = this.wrapper = Xd(), f = this.textarea = e.firstChild;
            a.wrapper.insertBefore(e, a.wrapper.firstChild);
            Qa && (f.style.width = "0px");
            v(f, "input", function () {
                B && 9 <= C && c.hasSelection && (c.hasSelection = null);
                c.poll()
            });
            v(f, "paste", function () {
                if (J && !d.state.fakedLastChar && !(200 > new Date - d.state.lastMiddleDown)) {
                    var a = f.selectionStart, b = f.selectionEnd;
                    f.value += "$";
                    f.selectionEnd = b;
                    f.selectionStart =
                        a;
                    d.state.fakedLastChar = !0
                }
                d.state.pasteIncoming = !0;
                c.fastPoll()
            });
            v(f, "cut", b);
            v(f, "copy", b);
            v(a.scroller, "paste", function (b) {
                oa(a, b) || (d.state.pasteIncoming = !0, c.focus())
            });
            v(a.lineSpace, "selectstart", function (b) {
                oa(a, b) || O(b)
            });
            v(f, "compositionstart", function () {
                var a = d.getCursor("from");
                c.composing = {start: a, range: d.markText(a, d.getCursor("to"), {className: "CodeMirror-composing"})}
            });
            v(f, "compositionend", function () {
                c.composing && (c.poll(), c.composing.range.clear(), c.composing = null)
            })
        }, prepareSelection: function () {
            var a =
                this.cm, b = a.display, c = a.doc, d = he(a);
            if (a.options.moveInputWithCursor) {
                var a = ma(a, c.sel.primary().head, "div"), c = b.wrapper.getBoundingClientRect(), e = b.lineDiv.getBoundingClientRect();
                d.teTop = Math.max(0, Math.min(b.wrapper.clientHeight - 10, a.top + e.top - c.top));
                d.teLeft = Math.max(0, Math.min(b.wrapper.clientWidth - 10, a.left + e.left - c.left))
            }
            return d
        }, showSelection: function (a) {
            var b = this.cm.display;
            U(b.cursorDiv, a.cursors);
            U(b.selectionDiv, a.selection);
            null != a.teTop && (this.wrapper.style.top = a.teTop + "px", this.wrapper.style.left =
                a.teLeft + "px")
        }, reset: function (a) {
            if (!this.contextMenuPending) {
                var b, c, d = this.cm, e = d.doc;
                d.somethingSelected() ? (this.prevInput = "", b = e.sel.primary(), c = (b = Ce && (100 < b.to().line - b.from().line || 1E3 < (c = d.getSelection()).length)) ? "-" : c || d.getSelection(), this.textarea.value = c, d.state.focused && Za(this.textarea), B && 9 <= C && (this.hasSelection = c)) : a || (this.prevInput = this.textarea.value = "", B && 9 <= C && (this.hasSelection = null));
                this.inaccurateSelection = b
            }
        }, getField: function () {
            return this.textarea
        }, supportsTouch: function () {
            return !1
        },
        focus: function () {
            if ("nocursor" != this.cm.options.readOnly && (!ab || fa() != this.textarea))try {
                this.textarea.focus()
            } catch (a) {
            }
        }, blur: function () {
            this.textarea.blur()
        }, resetPosition: function () {
            this.wrapper.style.top = this.wrapper.style.left = 0
        }, receivedFocus: function () {
            this.slowPoll()
        }, slowPoll: function () {
            var a = this;
            a.pollingFast || a.polling.set(this.cm.options.pollInterval, function () {
                a.poll();
                a.cm.state.focused && a.slowPoll()
            })
        }, fastPoll: function () {
            function a() {
                c.poll() || b ? (c.pollingFast = !1, c.slowPoll()) : (b = !0, c.polling.set(60, a))
            }

            var b = !1, c = this;
            c.pollingFast = !0;
            c.polling.set(20, a)
        }, poll: function () {
            var a = this.cm, b = this.textarea, c = this.prevInput;
            if (!a.state.focused || ng(b) && !c || Rb(a) || a.options.disableInput || a.state.keySeq)return !1;
            a.state.pasteIncoming && a.state.fakedLastChar && (b.value = b.value.substring(0, b.value.length - 1), a.state.fakedLastChar = !1);
            var d = b.value;
            if (d == c && !a.somethingSelected())return !1;
            if (B && 9 <= C && this.hasSelection === d || W && /[\uf700-\uf7ff]/.test(d))return a.display.input.reset(), !1;
            if (a.doc.sel ==
                a.display.selForContextMenu) {
                var e = d.charCodeAt(0);
                8203 != e || c || (c = "​");
                if (8666 == e)return this.reset(), this.cm.execCommand("undo")
            }
            for (var f = 0, e = Math.min(c.length, d.length); f < e && c.charCodeAt(f) == d.charCodeAt(f);)++f;
            var g = this;
            T(a, function () {
                Sc(a, d.slice(f), c.length - f, null, g.composing ? "*compose" : null);
                1E3 < d.length || -1 < d.indexOf("\n") ? b.value = g.prevInput = "" : g.prevInput = d;
                g.composing && (g.composing.range.clear(), g.composing.range = a.markText(g.composing.start, a.getCursor("to"), {className: "CodeMirror-composing"}))
            });
            return !0
        }, ensurePolled: function () {
            this.pollingFast && this.poll() && (this.pollingFast = !1)
        }, onKeyPress: function () {
            B && 9 <= C && (this.hasSelection = null);
            this.fastPoll()
        }, onContextMenu: function (a) {
            function b() {
                if (null != g.selectionStart) {
                    var a = e.somethingSelected(), b = "​" + (a ? g.value : "");
                    g.value = "⇚";
                    g.value = b;
                    d.prevInput = a ? "" : "​";
                    g.selectionStart = 1;
                    g.selectionEnd = b.length;
                    f.selForContextMenu = e.doc.sel
                }
            }

            function c() {
                d.contextMenuPending = !1;
                d.wrapper.style.position = "relative";
                g.style.cssText = l;
                B && 9 > C && f.scrollbars.setScrollTop(f.scroller.scrollTop =
                    k);
                if (null != g.selectionStart) {
                    (!B || B && 9 > C) && b();
                    var a = 0, c = function () {
                        f.selForContextMenu == e.doc.sel && 0 == g.selectionStart && 0 < g.selectionEnd && "​" == d.prevInput ? G(e, ic.selectAll)(e) : 10 > a++ ? f.detectingSelectAll = setTimeout(c, 500) : f.input.reset()
                    };
                    f.detectingSelectAll = setTimeout(c, 200)
                }
            }

            var d = this, e = d.cm, f = e.display, g = d.textarea, h = Ua(e, a), k = f.scroller.scrollTop;
            if (h && !ba) {
                e.options.resetSelectionOnContextMenu && -1 == e.doc.sel.contains(h) && G(e, H)(e.doc, ga(h), ha);
                var l = g.style.cssText;
                d.wrapper.style.position =
                    "absolute";
                g.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (a.clientY - 5) + "px; left: " + (a.clientX - 5) + "px; z-index: 1000; background: " + (B ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity\x3d5);";
                if (J)var m = window.scrollY;
                f.input.focus();
                J && window.scrollTo(null, m);
                f.input.reset();
                e.somethingSelected() || (g.value = d.prevInput = " ");
                d.contextMenuPending = !0;
                f.selForContextMenu = e.doc.sel;
                clearTimeout(f.detectingSelectAll);
                B && 9 <= C && b();
                if (id) {
                    jd(a);
                    var p = function () {
                        ka(window, "mouseup", p);
                        setTimeout(c, 20)
                    };
                    v(window, "mouseup", p)
                } else setTimeout(c, 50)
            }
        }, setUneditable: Eb, needsContentAttribute: !1
    }, Tc.prototype);
    Uc.prototype = V({
        init: function (a) {
            function b(a) {
                if (d.somethingSelected())X = d.getSelections(), "cut" == a.type && d.replaceSelection("", null, "cut"); else if (d.options.lineWiseCopyCut) {
                    var b = Vd(d);
                    X = b.text;
                    "cut" == a.type && d.operation(function () {
                        d.setSelections(b.ranges, 0, ha);
                        d.replaceSelection("", null, "cut")
                    })
                } else return;
                if (a.clipboardData && !Qa)a.preventDefault(), a.clipboardData.clearData(), a.clipboardData.setData("text/plain", X.join("\n")); else {
                    var c = Xd();
                    a = c.firstChild;
                    d.display.lineSpace.insertBefore(c, d.display.lineSpace.firstChild);
                    a.value = X.join("\n");
                    var h = document.activeElement;
                    Za(a);
                    setTimeout(function () {
                        d.display.lineSpace.removeChild(c);
                        h.focus()
                    }, 50)
                }
            }

            var c = this, d = c.cm;
            a = c.div = a.lineDiv;
            a.contentEditable = "true";
            Wd(a);
            v(a, "paste", function (a) {
                var b = a.clipboardData && a.clipboardData.getData("text/plain");
                b && (a.preventDefault(), d.replaceSelection(b, null, "paste"))
            });
            v(a, "compositionstart", function (a) {
                a = a.data;
                c.composing = {sel: d.doc.sel, data: a, startData: a};
                if (a) {
                    var b = d.doc.sel.primary(), g = d.getLine(b.head.line).indexOf(a, Math.max(0, b.head.ch - a.length));
                    -1 < g && g <= b.head.ch && (c.composing.sel = ga(r(b.head.line, g), r(b.head.line, g + a.length)))
                }
            });
            v(a, "compositionupdate", function (a) {
                c.composing.data = a.data
            });
            v(a, "compositionend", function (a) {
                var b = c.composing;
                b && (a.data == b.startData || /\u200b/.test(a.data) || (b.data =
                    a.data), setTimeout(function () {
                    b.handled || c.applyComposition(b);
                    c.composing == b && (c.composing = null)
                }, 50))
            });
            v(a, "touchstart", function () {
                c.forceCompositionEnd()
            });
            v(a, "input", function () {
                c.composing || c.pollContent() || T(c.cm, function () {
                    Q(d)
                })
            });
            v(a, "copy", b);
            v(a, "cut", b)
        }, prepareSelection: function () {
            var a = he(this.cm, !1);
            a.focus = this.cm.state.focused;
            return a
        }, showSelection: function (a) {
            a && this.cm.display.view.length && (a.focus && this.showPrimarySelection(), this.showMultipleSelections(a))
        }, showPrimarySelection: function () {
            var a =
                window.getSelection(), b = this.cm.doc.sel.primary(), c = Tb(this.cm, a.anchorNode, a.anchorOffset), d = Tb(this.cm, a.focusNode, a.focusOffset);
            if (!c || c.bad || !d || d.bad || 0 != y(Qb(c, d), b.from()) || 0 != y(Pb(c, d), b.to()))if (c = Yd(this.cm, b.from()), d = Yd(this.cm, b.to()), c || d) {
                var e = this.cm.display.view, b = a.rangeCount && a.getRangeAt(0);
                c ? d || (d = e[e.length - 1].measure, d = d.maps ? d.maps[d.maps.length - 1] : d.map, d = {
                    node: d[d.length - 1],
                    offset: d[d.length - 2] - d[d.length - 3]
                }) : c = {node: e[0].measure.map[2], offset: 0};
                try {
                    var f = Ea(c.node, c.offset,
                        d.offset, d.node)
                } catch (g) {
                }
                f && (a.removeAllRanges(), a.addRange(f), b && null == a.anchorNode ? a.addRange(b) : wa && this.startGracePeriod());
                this.rememberSelection()
            }
        }, startGracePeriod: function () {
            var a = this;
            clearTimeout(this.gracePeriod);
            this.gracePeriod = setTimeout(function () {
                a.gracePeriod = !1;
                a.selectionChanged() && a.cm.operation(function () {
                    a.cm.curOp.selectionChanged = !0
                })
            }, 20)
        }, showMultipleSelections: function (a) {
            U(this.cm.display.cursorDiv, a.cursors);
            U(this.cm.display.selectionDiv, a.selection)
        }, rememberSelection: function () {
            var a =
                window.getSelection();
            this.lastAnchorNode = a.anchorNode;
            this.lastAnchorOffset = a.anchorOffset;
            this.lastFocusNode = a.focusNode;
            this.lastFocusOffset = a.focusOffset
        }, selectionInEditor: function () {
            var a = window.getSelection();
            if (!a.rangeCount)return !1;
            a = a.getRangeAt(0).commonAncestorContainer;
            return Wc(this.div, a)
        }, focus: function () {
            "nocursor" != this.cm.options.readOnly && this.div.focus()
        }, blur: function () {
            this.div.blur()
        }, getField: function () {
            return this.div
        }, supportsTouch: function () {
            return !0
        }, receivedFocus: function () {
            function a() {
                b.cm.state.focused &&
                (b.pollSelection(), b.polling.set(b.cm.options.pollInterval, a))
            }

            var b = this;
            this.selectionInEditor() ? this.pollSelection() : T(this.cm, function () {
                b.cm.curOp.selectionChanged = !0
            });
            this.polling.set(this.cm.options.pollInterval, a)
        }, selectionChanged: function () {
            var a = window.getSelection();
            return a.anchorNode != this.lastAnchorNode || a.anchorOffset != this.lastAnchorOffset || a.focusNode != this.lastFocusNode || a.focusOffset != this.lastFocusOffset
        }, pollSelection: function () {
            if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
                var a =
                    window.getSelection(), b = this.cm;
                this.rememberSelection();
                var c = Tb(b, a.anchorNode, a.anchorOffset), d = Tb(b, a.focusNode, a.focusOffset);
                c && d && T(b, function () {
                    H(b.doc, ga(c, d), ha);
                    if (c.bad || d.bad)b.curOp.selectionChanged = !0
                })
            }
        }, pollContent: function () {
            var a = this.cm, b = a.display, c = a.doc.sel.primary(), d = c.from(), c = c.to();
            if (d.line < b.viewFrom || c.line > b.viewTo - 1)return !1;
            var e;
            d.line == b.viewFrom || 0 == (e = Ca(a, d.line)) ? (d = F(b.view[0].line), e = b.view[0].node) : (d = F(b.view[e].line), e = b.view[e - 1].node.nextSibling);
            var f =
                Ca(a, c.line);
            f == b.view.length - 1 ? (c = b.viewTo - 1, b = b.view[f].node) : (c = F(b.view[f + 1].line) - 1, b = b.view[f + 1].node.previousSibling);
            b = sa(xf(a, e, b, d, c));
            for (e = Da(a.doc, r(d, 0), r(c, u(a.doc, c).text.length)); 1 < b.length && 1 < e.length;)if (A(b) == A(e))b.pop(), e.pop(), c--; else if (b[0] == e[0])b.shift(), e.shift(), d++; else break;
            for (var g = 0, f = 0, h = b[0], k = e[0], l = Math.min(h.length, k.length); g < l && h.charCodeAt(g) == k.charCodeAt(g);)++g;
            h = A(b);
            k = A(e);
            for (l = Math.min(h.length - (1 == b.length ? g : 0), k.length - (1 == e.length ? g : 0)); f < l && h.charCodeAt(h.length -
            f - 1) == k.charCodeAt(k.length - f - 1);)++f;
            b[b.length - 1] = h.slice(0, h.length - f);
            b[0] = b[0].slice(g);
            d = r(d, g);
            c = r(c, e.length ? A(e).length - f : 0);
            if (1 < b.length || b[0] || y(d, c))return wb(a.doc, b, d, c, "+input"), !0
        }, ensurePolled: function () {
            this.forceCompositionEnd()
        }, reset: function () {
            this.forceCompositionEnd()
        }, forceCompositionEnd: function () {
            this.composing && !this.composing.handled && (this.applyComposition(this.composing), this.composing.handled = !0, this.div.blur(), this.div.focus())
        }, applyComposition: function (a) {
            a.data &&
            a.data != a.startData && G(this.cm, Sc)(this.cm, a.data, 0, a.sel)
        }, setUneditable: function (a) {
            a.setAttribute("contenteditable", "false")
        }, onKeyPress: function (a) {
            a.preventDefault();
            G(this.cm, Sc)(this.cm, String.fromCharCode(null == a.charCode ? a.keyCode : a.charCode), 0)
        }, onContextMenu: Eb, resetPosition: Eb, needsContentAttribute: !0
    }, Uc.prototype);
    q.inputStyles = {textarea: Tc, contenteditable: Uc};
    la.prototype = {
        primary: function () {
            return this.ranges[this.primIndex]
        }, equals: function (a) {
            if (a == this)return !0;
            if (a.primIndex !=
                this.primIndex || a.ranges.length != this.ranges.length)return !1;
            for (var b = 0; b < this.ranges.length; b++) {
                var c = this.ranges[b], d = a.ranges[b];
                if (0 != y(c.anchor, d.anchor) || 0 != y(c.head, d.head))return !1
            }
            return !0
        }, deepCopy: function () {
            for (var a = [], b = 0; b < this.ranges.length; b++)a[b] = new z(Rc(this.ranges[b].anchor), Rc(this.ranges[b].head));
            return new la(a, this.primIndex)
        }, somethingSelected: function () {
            for (var a = 0; a < this.ranges.length; a++)if (!this.ranges[a].empty())return !0;
            return !1
        }, contains: function (a, b) {
            b || (b = a);
            for (var c = 0; c < this.ranges.length; c++) {
                var d = this.ranges[c];
                if (0 <= y(b, d.from()) && 0 >= y(a, d.to()))return c
            }
            return -1
        }
    };
    z.prototype = {
        from: function () {
            return Qb(this.anchor, this.head)
        }, to: function () {
            return Pb(this.anchor, this.head)
        }, empty: function () {
            return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch
        }
    };
    var ad = {left: 0, right: 0, top: 0, bottom: 0}, Fa, Ta = null, Ff = 0, fc, ec, se = 0, gc = 0, R = null;
    B ? R = -.53 : wa ? R = 15 : kg ? R = -.7 : te && (R = -1 / 3);
    var ze = function (a) {
        var b = a.wheelDeltaX, c = a.wheelDeltaY;
        null == b && a.detail &&
        a.axis == a.HORIZONTAL_AXIS && (b = a.detail);
        null == c && a.detail && a.axis == a.VERTICAL_AXIS ? c = a.detail : null == c && (c = a.wheelDelta);
        return {x: b, y: c}
    };
    q.wheelEventPixels = function (a) {
        a = ze(a);
        a.x *= R;
        a.y *= R;
        return a
    };
    var Qf = new bb, md = null, ta = q.changeEnd = function (a) {
        return a.text ? r(a.from.line + a.text.length - 1, A(a.text).length + (1 == a.text.length ? a.from.ch : 0)) : a.to
    };
    q.prototype = {
        constructor: q, focus: function () {
            window.focus();
            this.display.input.focus()
        }, setOption: function (a, b) {
            var c = this.options, d = c[a];
            if (c[a] != b || "mode" ==
                a)c[a] = b, Ka.hasOwnProperty(a) && G(this, Ka[a])(this, b, d)
        }, getOption: function (a) {
            return this.options[a]
        }, getDoc: function () {
            return this.doc
        }, addKeyMap: function (a, b) {
            this.state.keyMaps[b ? "push" : "unshift"](pc(a))
        }, removeKeyMap: function (a) {
            for (var b = this.state.keyMaps, c = 0; c < b.length; ++c)if (b[c] == a || b[c].name == a)return b.splice(c, 1), !0
        }, addOverlay: M(function (a, b) {
            var c = a.token ? a : q.getMode(this.options, a);
            if (c.startState)throw Error("Overlays may not be stateful.");
            this.state.overlays.push({
                mode: c, modeSpec: a,
                opaque: b && b.opaque
            });
            this.state.modeGen++;
            Q(this)
        }), removeOverlay: M(function (a) {
            for (var b = this.state.overlays, c = 0; c < b.length; ++c) {
                var d = b[c].modeSpec;
                if (d == a || "string" == typeof a && d.name == a) {
                    b.splice(c, 1);
                    this.state.modeGen++;
                    Q(this);
                    break
                }
            }
        }), indentLine: M(function (a, b, c) {
            "string" != typeof b && "number" != typeof b && (b = null == b ? this.options.smartIndent ? "smart" : "prev" : b ? "add" : "subtract");
            qb(this.doc, a) && pb(this, a, b, c)
        }), indentSelection: M(function (a) {
            for (var b = this.doc.sel.ranges, c = -1, d = 0; d < b.length; d++) {
                var e =
                    b[d];
                if (e.empty())e.head.line > c && (pb(this, e.head.line, a, !0), c = e.head.line, d == this.doc.sel.primIndex && Pa(this)); else {
                    for (var f = e.from(), e = e.to(), g = Math.max(c, f.line), c = Math.min(this.lastLine(), e.line - (e.ch ? 0 : 1)) + 1, e = g; e < c; ++e)pb(this, e, a);
                    e = this.doc.sel.ranges;
                    0 == f.ch && b.length == e.length && 0 < e[d].from().ch && Xc(this.doc, d, new z(f, e[d].to()), ha)
                }
            }
        }), getTokenAt: function (a, b) {
            return Ye(this, a, b)
        }, getLineTokens: function (a, b) {
            return Ye(this, r(a), b, !0)
        }, getTokenTypeAt: function (a) {
            a = w(this.doc, a);
            var b = $e(this,
                u(this.doc, a.line)), c = 0, d = (b.length - 1) / 2;
            a = a.ch;
            if (0 == a)b = b[2]; else for (; ;) {
                var e = c + d >> 1;
                if ((e ? b[2 * e - 1] : 0) >= a)d = e; else if (b[2 * e + 1] < a)c = e + 1; else {
                    b = b[2 * e + 2];
                    break
                }
            }
            c = b ? b.indexOf("cm-overlay ") : -1;
            return 0 > c ? b : 0 == c ? null : b.slice(0, c - 1)
        }, getModeAt: function (a) {
            var b = this.doc.mode;
            return b.innerMode ? q.innerMode(b, this.getTokenAt(a).state).mode : b
        }, getHelper: function (a, b) {
            return this.getHelpers(a, b)[0]
        }, getHelpers: function (a, b) {
            var c = [];
            if (!$a.hasOwnProperty(b))return c;
            var d = $a[b], e = this.getModeAt(a);
            if ("string" == typeof e[b])d[e[b]] && c.push(d[e[b]]); else if (e[b])for (var f = 0; f < e[b].length; f++) {
                var g = d[e[b][f]];
                g && c.push(g)
            } else e.helperType && d[e.helperType] ? c.push(d[e.helperType]) : d[e.name] && c.push(d[e.name]);
            for (f = 0; f < d._global.length; f++)g = d._global[f], g.pred(e, this) && -1 == D(c, g.val) && c.push(g.val);
            return c
        }, getStateAfter: function (a, b) {
            var c = this.doc;
            a = Math.max(c.first, Math.min(null == a ? c.first + c.size - 1 : a, c.first + c.size - 1));
            return sb(this, a + 1, b)
        }, cursorCoords: function (a, b) {
            var c;
            c = this.doc.sel.primary();
            c =
                null == a ? c.head : "object" == typeof a ? w(this.doc, a) : a ? c.from() : c.to();
            return ma(this, c, b || "page")
        }, charCoords: function (a, b) {
            return Yb(this, w(this.doc, a), b || "page")
        }, coordsChar: function (a, b) {
            a = ne(this, a, b || "page");
            return fd(this, a.left, a.top)
        }, lineAtHeight: function (a, b) {
            a = ne(this, {top: a, left: 0}, b || "page").top;
            return Ba(this.doc, a + this.display.viewOffset)
        }, heightAtLine: function (a, b) {
            var c = !1, d;
            "number" == typeof a ? (d = this.doc.first + this.doc.size - 1, a < this.doc.first ? a = this.doc.first : a > d && (a = d, c = !0), d = u(this.doc,
                a)) : d = a;
            return cd(this, d, {top: 0, left: 0}, b || "page").top + (c ? this.doc.height - ea(d) : 0)
        }, defaultTextHeight: function () {
            return xa(this.display)
        }, defaultCharWidth: function () {
            return gb(this.display)
        }, setGutterMarker: M(function (a, b, c) {
            return nc(this.doc, a, "gutter", function (a) {
                var e = a.gutterMarkers || (a.gutterMarkers = {});
                e[b] = c;
                !c && hf(e) && (a.gutterMarkers = null);
                return !0
            })
        }), clearGutter: M(function (a) {
            var b = this, c = b.doc, d = c.first;
            c.iter(function (c) {
                c.gutterMarkers && c.gutterMarkers[a] && (c.gutterMarkers[a] = null,
                    na(b, d, "gutter"), hf(c.gutterMarkers) && (c.gutterMarkers = null));
                ++d
            })
        }), lineInfo: function (a) {
            if ("number" == typeof a) {
                if (!qb(this.doc, a))return null;
                var b = a;
                a = u(this.doc, a);
                if (!a)return null
            } else if (b = F(a), null == b)return null;
            return {
                line: b,
                handle: a,
                text: a.text,
                gutterMarkers: a.gutterMarkers,
                textClass: a.textClass,
                bgClass: a.bgClass,
                wrapClass: a.wrapClass,
                widgets: a.widgets
            }
        }, getViewport: function () {
            return {from: this.display.viewFrom, to: this.display.viewTo}
        }, addWidget: function (a, b, c, d, e) {
            var f = this.display;
            a =
                ma(this, w(this.doc, a));
            var g = a.bottom, h = a.left;
            b.style.position = "absolute";
            b.setAttribute("cm-ignore-events", "true");
            this.display.input.setUneditable(b);
            f.sizer.appendChild(b);
            if ("over" == d)g = a.top; else if ("above" == d || "near" == d) {
                var k = Math.max(f.wrapper.clientHeight, this.doc.height), l = Math.max(f.sizer.clientWidth, f.lineSpace.clientWidth);
                ("above" == d || a.bottom + b.offsetHeight > k) && a.top > b.offsetHeight ? g = a.top - b.offsetHeight : a.bottom + b.offsetHeight <= k && (g = a.bottom);
                h + b.offsetWidth > l && (h = l - b.offsetWidth)
            }
            b.style.top =
                g + "px";
            b.style.left = b.style.right = "";
            "right" == e ? (h = f.sizer.clientWidth - b.offsetWidth, b.style.right = "0px") : ("left" == e ? h = 0 : "middle" == e && (h = (f.sizer.clientWidth - b.offsetWidth) / 2), b.style.left = h + "px");
            c && (a = cc(this, h, g, h + b.offsetWidth, g + b.offsetHeight), null != a.scrollTop && lb(this, a.scrollTop), null != a.scrollLeft && Ma(this, a.scrollLeft))
        }, triggerOnKeyDown: M(ve), triggerOnKeyPress: M(we), triggerOnKeyUp: ue, execCommand: function (a) {
            if (ic.hasOwnProperty(a))return ic[a](this)
        }, findPosH: function (a, b, c, d) {
            var e = 1;
            0 > b && (e = -1, b = -b);
            var f = 0;
            for (a = w(this.doc, a); f < b && (a = rd(this.doc, a, e, c, d), !a.hitSide); ++f);
            return a
        }, moveH: M(function (a, b) {
            var c = this;
            c.extendSelectionsBy(function (d) {
                return c.display.shift || c.doc.extend || d.empty() ? rd(c.doc, d.head, a, b, c.options.rtlMoveVisually) : 0 > a ? d.from() : d.to()
            }, Gb)
        }), deleteH: M(function (a, b) {
            var c = this.doc;
            this.doc.sel.somethingSelected() ? c.replaceSelection("", null, "+delete") : Va(this, function (d) {
                var e = rd(c, d.head, a, b, !1);
                return 0 > a ? {from: e, to: d.head} : {from: d.head, to: e}
            })
        }), findPosV: function (a,
                                b, c, d) {
            var e = 1;
            0 > b && (e = -1, b = -b);
            var f = 0;
            for (a = w(this.doc, a); f < b && (a = ma(this, a, "div"), null == d ? d = a.left : a.left = d, a = Pe(this, a, e, c), !a.hitSide); ++f);
            return a
        }, moveV: M(function (a, b) {
            var c = this, d = this.doc, e = [], f = !c.display.shift && !d.extend && d.sel.somethingSelected();
            d.extendSelectionsBy(function (g) {
                    if (f)return 0 > a ? g.from() : g.to();
                    var k = ma(c, g.head, "div");
                    null != g.goalColumn && (k.left = g.goalColumn);
                    e.push(k.left);
                    var l = Pe(c, k, a, b);
                    "page" == b && g == d.sel.primary() && lc(c, null, Yb(c, l, "div").top - k.top);
                    return l
                },
                Gb);
            if (e.length)for (var g = 0; g < d.sel.ranges.length; g++)d.sel.ranges[g].goalColumn = e[g]
        }), findWordAt: function (a) {
            var b = u(this.doc, a.line).text, c = a.ch, d = a.ch;
            if (b) {
                var e = this.getHelper(a, "wordChars");
                (0 > a.xRel || d == b.length) && c ? --c : ++d;
                for (var f = b.charAt(c), f = oc(f, e) ? function (a) {
                    return oc(a, e)
                } : /\s/.test(f) ? function (a) {
                    return /\s/.test(a)
                } : function (a) {
                    return !/\s/.test(a) && !oc(a)
                }; 0 < c && f(b.charAt(c - 1));)--c;
                for (; d < b.length && f(b.charAt(d));)++d
            }
            return new z(r(a.line, c), r(a.line, d))
        }, toggleOverwrite: function (a) {
            if (null ==
                a || a != this.state.overwrite)(this.state.overwrite = !this.state.overwrite) ? mb(this.display.cursorDiv, "CodeMirror-overwrite") : kb(this.display.cursorDiv, "CodeMirror-overwrite"), K(this, "overwriteToggle", this, this.state.overwrite)
        }, hasFocus: function () {
            return this.display.input.getField() == fa()
        }, scrollTo: M(function (a, b) {
            null == a && null == b || mc(this);
            null != a && (this.curOp.scrollLeft = a);
            null != b && (this.curOp.scrollTop = b)
        }), getScrollInfo: function () {
            var a = this.display.scroller;
            return {
                left: a.scrollLeft,
                top: a.scrollTop,
                height: a.scrollHeight - da(this) - this.display.barHeight,
                width: a.scrollWidth - da(this) - this.display.barWidth,
                clientHeight: Nc(this),
                clientWidth: pa(this)
            }
        }, scrollIntoView: M(function (a, b) {
            null == a ? (a = {
                from: this.doc.sel.primary().head,
                to: null
            }, null == b && (b = this.options.cursorScrollMargin)) : "number" == typeof a ? a = {
                from: r(a, 0),
                to: null
            } : null == a.from && (a = {from: a, to: null});
            a.to || (a.to = a.from);
            a.margin = b || 0;
            if (null != a.from.line)mc(this), this.curOp.scrollToPos = a; else {
                var c = cc(this, Math.min(a.from.left, a.to.left), Math.min(a.from.top,
                    a.to.top) - a.margin, Math.max(a.from.right, a.to.right), Math.max(a.from.bottom, a.to.bottom) + a.margin);
                this.scrollTo(c.scrollLeft, c.scrollTop)
            }
        }), setSize: M(function (a, b) {
            function c(a) {
                return "number" == typeof a || /^\d+$/.test(String(a)) ? a + "px" : a
            }

            var d = this;
            null != a && (d.display.wrapper.style.width = c(a));
            null != b && (d.display.wrapper.style.height = c(b));
            d.options.lineWrapping && me(this);
            var e = d.display.viewFrom;
            d.doc.iter(e, d.display.viewTo, function (a) {
                if (a.widgets)for (var b = 0; b < a.widgets.length; b++)if (a.widgets[b].noHScroll) {
                    na(d,
                        e, "widget");
                    break
                }
                ++e
            });
            d.curOp.forceUpdate = !0;
            K(d, "refresh", this)
        }), operation: function (a) {
            return T(this, a)
        }, refresh: M(function () {
            var a = this.display.cachedTextHeight;
            Q(this);
            this.curOp.forceUpdate = !0;
            hb(this);
            this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);
            Cc(this);
            (null == a || .5 < Math.abs(a - xa(this.display))) && Ac(this);
            K(this, "refresh", this)
        }), swapDoc: M(function (a) {
            var b = this.doc;
            b.cm = null;
            Ed(this, a);
            hb(this);
            this.display.input.reset();
            this.scrollTo(a.scrollLeft, a.scrollTop);
            this.curOp.forceScroll = !0;
            L(this, "swapDoc", this, b);
            return b
        }), getInputField: function () {
            return this.display.input.getField()
        }, getWrapperElement: function () {
            return this.display.wrapper
        }, getScrollerElement: function () {
            return this.display.scroller
        }, getGutterElement: function () {
            return this.display.gutters
        }
    };
    Ya(q);
    var qf = q.defaults = {}, Ka = q.optionHandlers = {}, Fd = q.Init = {
        toString: function () {
            return "CodeMirror.Init"
        }
    };
    x("value", "", function (a, b) {
        a.setValue(b)
    }, !0);
    x("mode", null, function (a, b) {
        a.doc.modeOption = b;
        zc(a)
    }, !0);
    x("indentUnit",
        2, zc, !0);
    x("indentWithTabs", !1);
    x("smartIndent", !0);
    x("tabSize", 4, function (a) {
        eb(a);
        hb(a);
        Q(a)
    }, !0);
    x("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function (a, b, c) {
        a.state.specialChars = new RegExp(b.source + (b.test("\t") ? "" : "|\t"), "g");
        c != q.Init && a.refresh()
    });
    x("specialCharPlaceholder", function (a) {
        var b = t("span", "•", "cm-invalidchar");
        b.title = "\\u" + a.charCodeAt(0).toString(16);
        b.setAttribute("aria-label", b.title);
        return b
    }, function (a) {
        a.refresh()
    }, !0);
    x("electricChars", !0);
    x("inputStyle", ab ? "contenteditable" : "textarea", function () {
        throw Error("inputStyle can not (yet) be changed in a running editor");
    }, !0);
    x("rtlMoveVisually", !mg);
    x("wholeLineUpdateBefore", !0);
    x("theme", "default", function (a) {
        Bd(a);
        ib(a)
    }, !0);
    x("keyMap", "default", function (a, b, c) {
        b = pc(b);
        (c = c != q.Init && pc(c)) && c.detach && c.detach(a, b);
        b.attach && b.attach(a, c || null)
    });
    x("extraKeys", null);
    x("lineWrapping", !1, function (a) {
        a.options.lineWrapping ? (mb(a.display.wrapper, "CodeMirror-wrap"), a.display.sizer.style.minWidth =
            "", a.display.sizerWidth = null) : (kb(a.display.wrapper, "CodeMirror-wrap"), Dc(a));
        Ac(a);
        Q(a);
        hb(a);
        setTimeout(function () {
            Na(a)
        }, 100)
    }, !0);
    x("gutters", [], function (a) {
        wc(a.options);
        ib(a)
    }, !0);
    x("fixedGutter", !0, function (a, b) {
        a.display.gutters.style.left = b ? Ic(a.display) + "px" : "0";
        a.refresh()
    }, !0);
    x("coverGutterNextToScrollbar", !1, function (a) {
        Na(a)
    }, !0);
    x("scrollbarStyle", "native", function (a) {
            Cd(a);
            Na(a);
            a.display.scrollbars.setScrollTop(a.doc.scrollTop);
            a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)
        },
        !0);
    x("lineNumbers", !1, function (a) {
        wc(a.options);
        ib(a)
    }, !0);
    x("firstLineNumber", 1, ib, !0);
    x("lineNumberFormatter", function (a) {
        return a
    }, ib, !0);
    x("showCursorWhenSelecting", !1, nb, !0);
    x("resetSelectionOnContextMenu", !0);
    x("lineWiseCopyCut", !0);
    x("readOnly", !1, function (a, b) {
        "nocursor" == b ? (db(a), a.display.input.blur(), a.display.disabled = !0) : (a.display.disabled = !1, b || a.display.input.reset())
    });
    x("disableInput", !1, function (a, b) {
        b || a.display.input.reset()
    }, !0);
    x("dragDrop", !0, function (a, b, c) {
        !b != !(c && c != q.Init) &&
        (c = a.display.dragFunctions, b = b ? v : ka, b(a.display.scroller, "dragstart", c.start), b(a.display.scroller, "dragenter", c.simple), b(a.display.scroller, "dragover", c.simple), b(a.display.scroller, "drop", c.drop))
    });
    x("cursorBlinkRate", 530);
    x("cursorScrollMargin", 0);
    x("cursorHeight", 1, nb, !0);
    x("singleCursorHeightPerLine", !0, nb, !0);
    x("workTime", 100);
    x("workDelay", 100);
    x("flattenSpans", !0, eb, !0);
    x("addModeClass", !1, eb, !0);
    x("pollInterval", 100);
    x("undoDepth", 200, function (a, b) {
        a.doc.history.undoDepth = b
    });
    x("historyEventDelay",
        1250);
    x("viewportMargin", 10, function (a) {
        a.refresh()
    }, !0);
    x("maxHighlightLength", 1E4, eb, !0);
    x("moveInputWithCursor", !0, function (a, b) {
        b || a.display.input.resetPosition()
    });
    x("tabindex", null, function (a, b) {
        a.display.input.getField().tabIndex = b || ""
    });
    x("autofocus", null);
    var pf = q.modes = {}, Hb = q.mimeModes = {};
    q.defineMode = function (a, b) {
        q.defaults.mode || "null" == a || (q.defaults.mode = a);
        2 < arguments.length && (b.dependencies = Array.prototype.slice.call(arguments, 2));
        pf[a] = b
    };
    q.defineMIME = function (a, b) {
        Hb[a] = b
    };
    q.resolveMode =
        function (a) {
            if ("string" == typeof a && Hb.hasOwnProperty(a))a = Hb[a]; else if (a && "string" == typeof a.name && Hb.hasOwnProperty(a.name)) {
                var b = Hb[a.name];
                "string" == typeof b && (b = {name: b});
                a = ff(b, a);
                a.name = b.name
            } else if ("string" == typeof a && /^[\w\-]+\/[\w\-]+\+xml$/.test(a))return q.resolveMode("application/xml");
            return "string" == typeof a ? {name: a} : a || {name: "null"}
        };
    q.getMode = function (a, b) {
        b = q.resolveMode(b);
        var c = pf[b.name];
        if (!c)return q.getMode(a, "text/plain");
        c = c(a, b);
        if (Ib.hasOwnProperty(b.name)) {
            var d = Ib[b.name],
                e;
            for (e in d)d.hasOwnProperty(e) && (c.hasOwnProperty(e) && (c["_" + e] = c[e]), c[e] = d[e])
        }
        c.name = b.name;
        b.helperType && (c.helperType = b.helperType);
        if (b.modeProps)for (e in b.modeProps)c[e] = b.modeProps[e];
        return c
    };
    q.defineMode("null", function () {
        return {
            token: function (a) {
                a.skipToEnd()
            }
        }
    });
    q.defineMIME("text/plain", "null");
    var Ib = q.modeExtensions = {};
    q.extendMode = function (a, b) {
        var c = Ib.hasOwnProperty(a) ? Ib[a] : Ib[a] = {};
        V(b, c)
    };
    q.defineExtension = function (a, b) {
        q.prototype[a] = b
    };
    q.defineDocExtension = function (a, b) {
        P.prototype[a] =
            b
    };
    q.defineOption = x;
    var yc = [];
    q.defineInitHook = function (a) {
        yc.push(a)
    };
    var $a = q.helpers = {};
    q.registerHelper = function (a, b, c) {
        $a.hasOwnProperty(a) || ($a[a] = q[a] = {_global: []});
        $a[a][b] = c
    };
    q.registerGlobalHelper = function (a, b, c, d) {
        q.registerHelper(a, b, d);
        $a[a]._global.push({pred: c, val: d})
    };
    var Sa = q.copyState = function (a, b) {
        if (!0 === b)return b;
        if (a.copyState)return a.copyState(b);
        var c = {}, d;
        for (d in b) {
            var e = b[d];
            e instanceof Array && (e = e.concat([]));
            c[d] = e
        }
        return c
    }, Df = q.startState = function (a, b, c) {
        return a.startState ?
            a.startState(b, c) : !0
    };
    q.innerMode = function (a, b) {
        for (; a.innerMode;) {
            var c = a.innerMode(b);
            if (!c || c.mode == a)break;
            b = c.state;
            a = c.mode
        }
        return c || {mode: a, state: b}
    };
    var ic = q.commands = {
        selectAll: function (a) {
            a.setSelection(r(a.firstLine(), 0), r(a.lastLine()), ha)
        }, singleSelection: function (a) {
            a.setSelection(a.getCursor("anchor"), a.getCursor("head"), ha)
        }, killLine: function (a) {
            Va(a, function (b) {
                if (b.empty()) {
                    var c = u(a.doc, b.head.line).text.length;
                    return b.head.ch == c && b.head.line < a.lastLine() ? {
                        from: b.head, to: r(b.head.line +
                        1, 0)
                    } : {from: b.head, to: r(b.head.line, c)}
                }
                return {from: b.from(), to: b.to()}
            })
        }, deleteLine: function (a) {
            Va(a, function (b) {
                return {from: r(b.from().line, 0), to: w(a.doc, r(b.to().line + 1, 0))}
            })
        }, delLineLeft: function (a) {
            Va(a, function (a) {
                return {from: r(a.from().line, 0), to: a.from()}
            })
        }, delWrappedLineLeft: function (a) {
            Va(a, function (b) {
                var c = a.charCoords(b.head, "div").top + 5;
                return {from: a.coordsChar({left: 0, top: c}, "div"), to: b.from()}
            })
        }, delWrappedLineRight: function (a) {
            Va(a, function (b) {
                var c = a.charCoords(b.head, "div").top +
                    5, c = a.coordsChar({left: a.display.lineDiv.offsetWidth + 100, top: c}, "div");
                return {from: b.from(), to: c}
            })
        }, undo: function (a) {
            a.undo()
        }, redo: function (a) {
            a.redo()
        }, undoSelection: function (a) {
            a.undoSelection()
        }, redoSelection: function (a) {
            a.redoSelection()
        }, goDocStart: function (a) {
            a.extendSelection(r(a.firstLine(), 0))
        }, goDocEnd: function (a) {
            a.extendSelection(r(a.lastLine()))
        }, goLineStart: function (a) {
            a.extendSelectionsBy(function (b) {
                return kf(a, b.head.line)
            }, {origin: "+move", bias: 1})
        }, goLineStartSmart: function (a) {
            a.extendSelectionsBy(function (b) {
                return lf(a,
                    b.head)
            }, {origin: "+move", bias: 1})
        }, goLineEnd: function (a) {
            a.extendSelectionsBy(function (b) {
                b = b.head.line;
                for (var c, d = u(a.doc, b); c = Aa(d, !1);)d = c.find(1, !0).line, b = null;
                c = (c = Y(d)) ? c[0].level % 2 ? ac(d) : bc(d) : d.text.length;
                return r(null == b ? F(d) : b, c)
            }, {origin: "+move", bias: -1})
        }, goLineRight: function (a) {
            a.extendSelectionsBy(function (b) {
                b = a.charCoords(b.head, "div").top + 5;
                return a.coordsChar({left: a.display.lineDiv.offsetWidth + 100, top: b}, "div")
            }, Gb)
        }, goLineLeft: function (a) {
            a.extendSelectionsBy(function (b) {
                b =
                    a.charCoords(b.head, "div").top + 5;
                return a.coordsChar({left: 0, top: b}, "div")
            }, Gb)
        }, goLineLeftSmart: function (a) {
            a.extendSelectionsBy(function (b) {
                var c = a.charCoords(b.head, "div").top + 5, c = a.coordsChar({left: 0, top: c}, "div");
                return c.ch < a.getLine(c.line).search(/\S/) ? lf(a, b.head) : c
            }, Gb)
        }, goLineUp: function (a) {
            a.moveV(-1, "line")
        }, goLineDown: function (a) {
            a.moveV(1, "line")
        }, goPageUp: function (a) {
            a.moveV(-1, "page")
        }, goPageDown: function (a) {
            a.moveV(1, "page")
        }, goCharLeft: function (a) {
            a.moveH(-1, "char")
        }, goCharRight: function (a) {
            a.moveH(1,
                "char")
        }, goColumnLeft: function (a) {
            a.moveH(-1, "column")
        }, goColumnRight: function (a) {
            a.moveH(1, "column")
        }, goWordLeft: function (a) {
            a.moveH(-1, "word")
        }, goGroupRight: function (a) {
            a.moveH(1, "group")
        }, goGroupLeft: function (a) {
            a.moveH(-1, "group")
        }, goWordRight: function (a) {
            a.moveH(1, "word")
        }, delCharBefore: function (a) {
            a.deleteH(-1, "char")
        }, delCharAfter: function (a) {
            a.deleteH(1, "char")
        }, delWordBefore: function (a) {
            a.deleteH(-1, "word")
        }, delWordAfter: function (a) {
            a.deleteH(1, "word")
        }, delGroupBefore: function (a) {
            a.deleteH(-1,
                "group")
        }, delGroupAfter: function (a) {
            a.deleteH(1, "group")
        }, indentAuto: function (a) {
            a.indentSelection("smart")
        }, indentMore: function (a) {
            a.indentSelection("add")
        }, indentLess: function (a) {
            a.indentSelection("subtract")
        }, insertTab: function (a) {
            a.replaceSelection("\t")
        }, insertSoftTab: function (a) {
            for (var b = [], c = a.listSelections(), d = a.options.tabSize, e = 0; e < c.length; e++) {
                var f = c[e].from(), f = aa(a.getLine(f.line), f.ch, d);
                b.push(Array(d - f % d + 1).join(" "))
            }
            a.replaceSelections(b)
        }, defaultTab: function (a) {
            a.somethingSelected() ?
                a.indentSelection("add") : a.execCommand("insertTab")
        }, transposeChars: function (a) {
            T(a, function () {
                for (var b = a.listSelections(), c = [], d = 0; d < b.length; d++) {
                    var e = b[d].head, f = u(a.doc, e.line).text;
                    if (f)if (e.ch == f.length && (e = new r(e.line, e.ch - 1)), 0 < e.ch)e = new r(e.line, e.ch + 1), a.replaceRange(f.charAt(e.ch - 1) + f.charAt(e.ch - 2), r(e.line, e.ch - 2), e, "+transpose"); else if (e.line > a.doc.first) {
                        var g = u(a.doc, e.line - 1).text;
                        g && a.replaceRange(f.charAt(0) + "\n" + g.charAt(g.length - 1), r(e.line - 1, g.length - 1), r(e.line, 1), "+transpose")
                    }
                    c.push(new z(e,
                        e))
                }
                a.setSelections(c)
            })
        }, newlineAndIndent: function (a) {
            T(a, function () {
                for (var b = a.listSelections().length, c = 0; c < b; c++) {
                    var d = a.listSelections()[c];
                    a.replaceRange("\n", d.anchor, d.head, "+input");
                    a.indentLine(d.from().line + 1, null, !0);
                    Pa(a)
                }
            })
        }, toggleOverwrite: function (a) {
            a.toggleOverwrite()
        }
    }, ua = q.keyMap = {};
    ua.basic = {
        Left: "goCharLeft",
        Right: "goCharRight",
        Up: "goLineUp",
        Down: "goLineDown",
        End: "goLineEnd",
        Home: "goLineStartSmart",
        PageUp: "goPageUp",
        PageDown: "goPageDown",
        Delete: "delCharAfter",
        Backspace: "delCharBefore",
        "Shift-Backspace": "delCharBefore",
        Tab: "defaultTab",
        "Shift-Tab": "indentAuto",
        Enter: "newlineAndIndent",
        Insert: "toggleOverwrite",
        Esc: "singleSelection"
    };
    ua.pcDefault = {
        "Ctrl-A": "selectAll",
        "Ctrl-D": "deleteLine",
        "Ctrl-Z": "undo",
        "Shift-Ctrl-Z": "redo",
        "Ctrl-Y": "redo",
        "Ctrl-Home": "goDocStart",
        "Ctrl-End": "goDocEnd",
        "Ctrl-Up": "goLineUp",
        "Ctrl-Down": "goLineDown",
        "Ctrl-Left": "goGroupLeft",
        "Ctrl-Right": "goGroupRight",
        "Alt-Left": "goLineStart",
        "Alt-Right": "goLineEnd",
        "Ctrl-Backspace": "delGroupBefore",
        "Ctrl-Delete": "delGroupAfter",
        "Ctrl-S": "save",
        "Ctrl-F": "find",
        "Ctrl-G": "findNext",
        "Shift-Ctrl-G": "findPrev",
        "Shift-Ctrl-F": "replace",
        "Shift-Ctrl-R": "replaceAll",
        "Ctrl-[": "indentLess",
        "Ctrl-]": "indentMore",
        "Ctrl-U": "undoSelection",
        "Shift-Ctrl-U": "redoSelection",
        "Alt-U": "redoSelection",
        fallthrough: "basic"
    };
    ua.emacsy = {
        "Ctrl-F": "goCharRight",
        "Ctrl-B": "goCharLeft",
        "Ctrl-P": "goLineUp",
        "Ctrl-N": "goLineDown",
        "Alt-F": "goWordRight",
        "Alt-B": "goWordLeft",
        "Ctrl-A": "goLineStart",
        "Ctrl-E": "goLineEnd",
        "Ctrl-V": "goPageDown",
        "Shift-Ctrl-V": "goPageUp",
        "Ctrl-D": "delCharAfter",
        "Ctrl-H": "delCharBefore",
        "Alt-D": "delWordAfter",
        "Alt-Backspace": "delWordBefore",
        "Ctrl-K": "killLine",
        "Ctrl-T": "transposeChars"
    };
    ua.macDefault = {
        "Cmd-A": "selectAll",
        "Cmd-D": "deleteLine",
        "Cmd-Z": "undo",
        "Shift-Cmd-Z": "redo",
        "Cmd-Y": "redo",
        "Cmd-Home": "goDocStart",
        "Cmd-Up": "goDocStart",
        "Cmd-End": "goDocEnd",
        "Cmd-Down": "goDocEnd",
        "Alt-Left": "goGroupLeft",
        "Alt-Right": "goGroupRight",
        "Cmd-Left": "goLineLeft",
        "Cmd-Right": "goLineRight",
        "Alt-Backspace": "delGroupBefore",
        "Ctrl-Alt-Backspace": "delGroupAfter",
        "Alt-Delete": "delGroupAfter",
        "Cmd-S": "save",
        "Cmd-F": "find",
        "Cmd-G": "findNext",
        "Shift-Cmd-G": "findPrev",
        "Cmd-Alt-F": "replace",
        "Shift-Cmd-Alt-F": "replaceAll",
        "Cmd-[": "indentLess",
        "Cmd-]": "indentMore",
        "Cmd-Backspace": "delWrappedLineLeft",
        "Cmd-Delete": "delWrappedLineRight",
        "Cmd-U": "undoSelection",
        "Shift-Cmd-U": "redoSelection",
        "Ctrl-Up": "goDocStart",
        "Ctrl-Down": "goDocEnd",
        fallthrough: ["basic", "emacsy"]
    };
    ua["default"] = W ? ua.macDefault : ua.pcDefault;
    q.normalizeKeyMap = function (a) {
        var b = {}, c;
        for (c in a)if (a.hasOwnProperty(c)) {
            var d =
                a[c];
            if (!/^(name|fallthrough|(de|at)tach)$/.test(c)) {
                if ("..." != d)for (var e = ob(c.split(" "), Wf), f = 0; f < e.length; f++) {
                    var g, h;
                    f == e.length - 1 ? (h = c, g = d) : (h = e.slice(0, f + 1).join(" "), g = "...");
                    var k = b[h];
                    if (!k)b[h] = g; else if (k != g)throw Error("Inconsistent bindings for " + h);
                }
                delete a[c]
            }
        }
        for (var l in b)a[l] = b[l];
        return a
    };
    var xb = q.lookupKey = function (a, b, c, d) {
        b = pc(b);
        var e = b.call ? b.call(a, d) : b[a];
        if (!1 === e)return "nothing";
        if ("..." === e)return "multi";
        if (null != e && c(e))return "handled";
        if (b.fallthrough) {
            if ("[object Array]" !=
                Object.prototype.toString.call(b.fallthrough))return xb(a, b.fallthrough, c, d);
            for (e = 0; e < b.fallthrough.length; e++) {
                var f = xb(a, b.fallthrough[e], c, d);
                if (f)return f
            }
        }
    }, Pf = q.isModifierKey = function (a) {
        a = "string" == typeof a ? a : va[a.keyCode];
        return "Ctrl" == a || "Alt" == a || "Shift" == a || "Mod" == a
    }, Rf = q.keyName = function (a, b) {
        if (ba && 34 == a.keyCode && a["char"])return !1;
        var c = va[a.keyCode], d = c;
        if (null == d || a.altGraphKey)return !1;
        a.altKey && "Alt" != c && (d = "Alt-" + d);
        (of ? a.metaKey : a.ctrlKey) && "Ctrl" != c && (d = "Ctrl-" + d);
        (of ? a.ctrlKey :
            a.metaKey) && "Cmd" != c && (d = "Cmd-" + d);
        !b && a.shiftKey && "Shift" != c && (d = "Shift-" + d);
        return d
    };
    q.fromTextArea = function (a, b) {
        function c() {
            a.value = k.getValue()
        }

        b = b ? V(b) : {};
        b.value = a.value;
        !b.tabindex && a.tabIndex && (b.tabindex = a.tabIndex);
        !b.placeholder && a.placeholder && (b.placeholder = a.placeholder);
        if (null == b.autofocus) {
            var d = fa();
            b.autofocus = d == a || null != a.getAttribute("autofocus") && d == document.body
        }
        if (a.form && (v(a.form, "submit", c), !b.leaveSubmitMethodAlone)) {
            var e = a.form, f = e.submit;
            try {
                var g = e.submit = function () {
                    c();
                    e.submit = f;
                    e.submit();
                    e.submit = g
                }
            } catch (h) {
            }
        }
        b.finishInit = function (b) {
            b.save = c;
            b.getTextArea = function () {
                return a
            };
            b.toTextArea = function () {
                b.toTextArea = isNaN;
                c();
                a.parentNode.removeChild(b.getWrapperElement());
                a.style.display = "";
                a.form && (ka(a.form, "submit", c), "function" == typeof a.form.submit && (a.form.submit = f))
            }
        };
        a.style.display = "none";
        var k = q(function (b) {
            a.parentNode.insertBefore(b, a.nextSibling)
        }, b);
        return k
    };
    var tc = q.StringStream = function (a, b) {
        this.pos = this.start = 0;
        this.string = a;
        this.tabSize = b ||
        8;
        this.lineStart = this.lastColumnPos = this.lastColumnValue = 0
    };
    tc.prototype = {
        eol: function () {
            return this.pos >= this.string.length
        }, sol: function () {
            return this.pos == this.lineStart
        }, peek: function () {
            return this.string.charAt(this.pos) || void 0
        }, next: function () {
            if (this.pos < this.string.length)return this.string.charAt(this.pos++)
        }, eat: function (a) {
            var b = this.string.charAt(this.pos);
            if ("string" == typeof a ? b == a : b && (a.test ? a.test(b) : a(b)))return ++this.pos, b
        }, eatWhile: function (a) {
            for (var b = this.pos; this.eat(a););
            return this.pos >
                b
        }, eatSpace: function () {
            for (var a = this.pos; /[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;
            return this.pos > a
        }, skipToEnd: function () {
            this.pos = this.string.length
        }, skipTo: function (a) {
            a = this.string.indexOf(a, this.pos);
            if (-1 < a)return this.pos = a, !0
        }, backUp: function (a) {
            this.pos -= a
        }, column: function () {
            this.lastColumnPos < this.start && (this.lastColumnValue = aa(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue), this.lastColumnPos = this.start);
            return this.lastColumnValue - (this.lineStart ?
                    aa(this.string, this.lineStart, this.tabSize) : 0)
        }, indentation: function () {
            return aa(this.string, null, this.tabSize) - (this.lineStart ? aa(this.string, this.lineStart, this.tabSize) : 0)
        }, match: function (a, b, c) {
            if ("string" == typeof a) {
                var d = function (a) {
                    return c ? a.toLowerCase() : a
                }, e = this.string.substr(this.pos, a.length);
                if (d(e) == d(a))return !1 !== b && (this.pos += a.length), !0
            } else {
                if ((a = this.string.slice(this.pos).match(a)) && 0 < a.index)return null;
                a && !1 !== b && (this.pos += a[0].length);
                return a
            }
        }, current: function () {
            return this.string.slice(this.start,
                this.pos)
        }, hideFirstChars: function (a, b) {
            this.lineStart += a;
            try {
                return b()
            } finally {
                this.lineStart -= a
            }
        }
    };
    var sd = 0, Ha = q.TextMarker = function (a, b) {
        this.lines = [];
        this.type = b;
        this.doc = a;
        this.id = ++sd
    };
    Ya(Ha);
    Ha.prototype.clear = function () {
        if (!this.explicitlyCleared) {
            var a = this.doc.cm, b = a && !a.curOp;
            b && Ja(a);
            if (S(this, "clear")) {
                var c = this.find();
                c && L(this, "clear", c.from, c.to)
            }
            for (var d = c = null, e = 0; e < this.lines.length; ++e) {
                var f = this.lines[e], g = zb(f.markedSpans, this);
                a && !this.collapsed ? na(a, F(f), "text") : a && (null !=
                g.to && (d = F(f)), null != g.from && (c = F(f)));
                for (var h = f, k = f.markedSpans, l = g, m = void 0, p = 0; p < k.length; ++p)k[p] != l && (m || (m = [])).push(k[p]);
                h.markedSpans = m;
                null == g.from && this.collapsed && !ya(this.doc, f) && a && ca(f, xa(a.display))
            }
            if (a && this.collapsed && !a.options.lineWrapping)for (e = 0; e < this.lines.length; ++e)f = ia(this.lines[e]), g = Kb(f), g > a.display.maxLineLength && (a.display.maxLine = f, a.display.maxLineLength = g, a.display.maxLineChanged = !0);
            null != c && a && this.collapsed && Q(a, c, d + 1);
            this.lines.length = 0;
            this.explicitlyCleared = !0;
            this.atomic && this.doc.cantEdit && (this.doc.cantEdit = !1, a && ge(a.doc));
            a && L(a, "markerCleared", a, this);
            b && La(a);
            this.parent && this.parent.clear()
        }
    };
    Ha.prototype.find = function (a, b) {
        null == a && "bookmark" == this.type && (a = 1);
        for (var c, d, e = 0; e < this.lines.length; ++e) {
            var f = this.lines[e], g = zb(f.markedSpans, this);
            if (null != g.from && (c = r(b ? f : F(f), g.from), -1 == a))return c;
            if (null != g.to && (d = r(b ? f : F(f), g.to), 1 == a))return d
        }
        return c && {from: c, to: d}
    };
    Ha.prototype.changed = function () {
        var a = this.find(-1, !0), b = this, c = this.doc.cm;
        a && c && T(c, function () {
            var d = a.line, e = F(a.line);
            if (e = Vc(c, e))le(e), c.curOp.selectionChanged = c.curOp.forceUpdate = !0;
            c.curOp.updateMaxLine = !0;
            ya(b.doc, d) || null == b.height || (e = b.height, b.height = null, (e = ub(b) - e) && ca(d, d.height + e))
        })
    };
    Ha.prototype.attachLine = function (a) {
        if (!this.lines.length && this.doc.cm) {
            var b = this.doc.cm.curOp;
            b.maybeHiddenMarkers && -1 != D(b.maybeHiddenMarkers, this) || (b.maybeUnhiddenMarkers || (b.maybeUnhiddenMarkers = [])).push(this)
        }
        this.lines.push(a)
    };
    Ha.prototype.detachLine = function (a) {
        this.lines.splice(D(this.lines,
            a), 1);
        !this.lines.length && this.doc.cm && (a = this.doc.cm.curOp, (a.maybeHiddenMarkers || (a.maybeHiddenMarkers = [])).push(this))
    };
    var sd = 0, rc = q.SharedTextMarker = function (a, b) {
        this.markers = a;
        this.primary = b;
        for (var c = 0; c < a.length; ++c)a[c].parent = this
    };
    Ya(rc);
    rc.prototype.clear = function () {
        if (!this.explicitlyCleared) {
            this.explicitlyCleared = !0;
            for (var a = 0; a < this.markers.length; ++a)this.markers[a].clear();
            L(this, "clear")
        }
    };
    rc.prototype.find = function (a, b) {
        return this.primary.find(a, b)
    };
    var sc = q.LineWidget = function (a,
                                      b, c) {
        if (c)for (var d in c)c.hasOwnProperty(d) && (this[d] = c[d]);
        this.doc = a;
        this.node = b
    };
    Ya(sc);
    sc.prototype.clear = function () {
        var a = this.doc.cm, b = this.line.widgets, c = this.line, d = F(c);
        if (null != d && b) {
            for (var e = 0; e < b.length; ++e)b[e] == this && b.splice(e--, 1);
            b.length || (c.widgets = null);
            var f = ub(this);
            ca(c, Math.max(0, c.height - f));
            a && T(a, function () {
                var b = -f;
                ea(c) < (a.curOp && a.curOp.scrollTop || a.doc.scrollTop) && lc(a, null, b);
                na(a, d, "widget")
            })
        }
    };
    sc.prototype.changed = function () {
        var a = this.height, b = this.doc.cm, c = this.line;
        this.height = null;
        var d = ub(this) - a;
        d && (ca(c, c.height + d), b && T(b, function () {
            b.curOp.forceUpdate = !0;
            ea(c) < (b.curOp && b.curOp.scrollTop || b.doc.scrollTop) && lc(b, null, d)
        }))
    };
    var Ab = q.Line = function (a, b, c) {
        this.text = a;
        Ue(this, b);
        this.height = c ? c(this) : 1
    };
    Ya(Ab);
    Ab.prototype.lineNo = function () {
        return F(this)
    };
    var bg = {}, ag = {};
    Bb.prototype = {
        chunkSize: function () {
            return this.lines.length
        }, removeInner: function (a, b) {
            for (var c = a, d = a + b; c < d; ++c) {
                var e = this.lines[c];
                this.height -= e.height;
                var f = e;
                f.parent = null;
                Te(f);
                L(e,
                    "delete")
            }
            this.lines.splice(a, b)
        }, collapse: function (a) {
            a.push.apply(a, this.lines)
        }, insertInner: function (a, b, c) {
            this.height += c;
            this.lines = this.lines.slice(0, a).concat(b).concat(this.lines.slice(a));
            for (a = 0; a < b.length; ++a)b[a].parent = this
        }, iterN: function (a, b, c) {
            for (b = a + b; a < b; ++a)if (c(this.lines[a]))return !0
        }
    };
    Cb.prototype = {
        chunkSize: function () {
            return this.size
        }, removeInner: function (a, b) {
            this.size -= b;
            for (var c = 0; c < this.children.length; ++c) {
                var d = this.children[c], e = d.chunkSize();
                if (a < e) {
                    var f = Math.min(b,
                        e - a), g = d.height;
                    d.removeInner(a, f);
                    this.height -= g - d.height;
                    e == f && (this.children.splice(c--, 1), d.parent = null);
                    if (0 == (b -= f))break;
                    a = 0
                } else a -= e
            }
            25 > this.size - b && (1 < this.children.length || !(this.children[0]instanceof Bb)) && (c = [], this.collapse(c), this.children = [new Bb(c)], this.children[0].parent = this)
        }, collapse: function (a) {
            for (var b = 0; b < this.children.length; ++b)this.children[b].collapse(a)
        }, insertInner: function (a, b, c) {
            this.size += b.length;
            this.height += c;
            for (var d = 0; d < this.children.length; ++d) {
                var e = this.children[d],
                    f = e.chunkSize();
                if (a <= f) {
                    e.insertInner(a, b, c);
                    if (e.lines && 50 < e.lines.length) {
                        for (; 50 < e.lines.length;)a = e.lines.splice(e.lines.length - 25, 25), a = new Bb(a), e.height -= a.height, this.children.splice(d + 1, 0, a), a.parent = this;
                        this.maybeSpill()
                    }
                    break
                }
                a -= f
            }
        }, maybeSpill: function () {
            if (!(10 >= this.children.length)) {
                var a = this;
                do {
                    var b = a.children.splice(a.children.length - 5, 5), b = new Cb(b);
                    if (a.parent) {
                        a.size -= b.size;
                        a.height -= b.height;
                        var c = D(a.parent.children, a);
                        a.parent.children.splice(c + 1, 0, b)
                    } else c = new Cb(a.children),
                        c.parent = a, a.children = [c, b], a = c;
                    b.parent = a.parent
                } while (10 < a.children.length);
                a.parent.maybeSpill()
            }
        }, iterN: function (a, b, c) {
            for (var d = 0; d < this.children.length; ++d) {
                var e = this.children[d], f = e.chunkSize();
                if (a < f) {
                    f = Math.min(b, f - a);
                    if (e.iterN(a, f, c))return !0;
                    if (0 == (b -= f))break;
                    a = 0
                } else a -= f
            }
        }
    };
    var og = 0, P = q.Doc = function (a, b, c) {
        if (!(this instanceof P))return new P(a, b, c);
        null == c && (c = 0);
        Cb.call(this, [new Bb([new Ab("", null)])]);
        this.first = c;
        this.scrollTop = this.scrollLeft = 0;
        this.cantEdit = !1;
        this.cleanGeneration =
            1;
        this.frontier = c;
        c = r(c, 0);
        this.sel = ga(c);
        this.history = new uc(null);
        this.id = ++og;
        this.modeOption = b;
        "string" == typeof a && (a = sa(a));
        qd(this, {from: c, to: c, text: a});
        H(this, ga(c), ha)
    };
    P.prototype = ff(Cb.prototype, {
        constructor: P, iter: function (a, b, c) {
            c ? this.iterN(a - this.first, b - a, c) : this.iterN(this.first, this.first + this.size, a)
        }, insert: function (a, b) {
            for (var c = 0, d = 0; d < b.length; ++d)c += b[d].height;
            this.insertInner(a - this.first, b, c)
        }, remove: function (a, b) {
            this.removeInner(a - this.first, b)
        }, getValue: function (a) {
            var b =
                xd(this, this.first, this.first + this.size);
            return !1 === a ? b : b.join(a || "\n")
        }, setValue: N(function (a) {
            var b = r(this.first, 0), c = this.first + this.size - 1;
            Oa(this, {from: b, to: r(c, u(this, c).text.length), text: sa(a), origin: "setValue", full: !0}, !0);
            H(this, ga(b))
        }), replaceRange: function (a, b, c, d) {
            b = w(this, b);
            c = c ? w(this, c) : b;
            wb(this, a, b, c, d)
        }, getRange: function (a, b, c) {
            a = Da(this, w(this, a), w(this, b));
            return !1 === c ? a : a.join(c || "\n")
        }, getLine: function (a) {
            return (a = this.getLineHandle(a)) && a.text
        }, getLineHandle: function (a) {
            if (qb(this,
                    a))return u(this, a)
        }, getLineNumber: function (a) {
            return F(a)
        }, getLineHandleVisualStart: function (a) {
            "number" == typeof a && (a = u(this, a));
            return ia(a)
        }, lineCount: function () {
            return this.size
        }, firstLine: function () {
            return this.first
        }, lastLine: function () {
            return this.first + this.size - 1
        }, clipPos: function (a) {
            return w(this, a)
        }, getCursor: function (a) {
            var b = this.sel.primary();
            return null == a || "head" == a ? b.head : "anchor" == a ? b.anchor : "end" == a || "to" == a || !1 === a ? b.to() : b.from()
        }, listSelections: function () {
            return this.sel.ranges
        },
        somethingSelected: function () {
            return this.sel.somethingSelected()
        }, setCursor: N(function (a, b, c) {
            a = w(this, "number" == typeof a ? r(a, b || 0) : a);
            H(this, ga(a, null), c)
        }), setSelection: N(function (a, b, c) {
            var d = w(this, a);
            a = w(this, b || a);
            H(this, ga(d, a), c)
        }), extendSelection: N(function (a, b, c) {
            Ub(this, w(this, a), b && w(this, b), c)
        }), extendSelections: N(function (a, b) {
            for (var c = [], d = 0; d < a.length; d++)c[d] = w(this, a[d]);
            ae(this, c)
        }), extendSelectionsBy: N(function (a, b) {
            ae(this, ob(this.sel.ranges, a), b)
        }), setSelections: N(function (a,
                                       b, c) {
            if (a.length) {
                for (var d = 0, e = []; d < a.length; d++)e[d] = new z(w(this, a[d].anchor), w(this, a[d].head));
                null == b && (b = Math.min(a.length - 1, this.sel.primIndex));
                H(this, Z(e, b), c)
            }
        }), addSelection: N(function (a, b, c) {
            var d = this.sel.ranges.slice(0);
            d.push(new z(w(this, a), w(this, b || a)));
            H(this, Z(d, d.length - 1), c)
        }), getSelection: function (a) {
            for (var b = this.sel.ranges, c, d = 0; d < b.length; d++) {
                var e = Da(this, b[d].from(), b[d].to());
                c = c ? c.concat(e) : e
            }
            return !1 === a ? c : c.join(a || "\n")
        }, getSelections: function (a) {
            for (var b = [], c =
                this.sel.ranges, d = 0; d < c.length; d++) {
                var e = Da(this, c[d].from(), c[d].to());
                !1 !== a && (e = e.join(a || "\n"));
                b[d] = e
            }
            return b
        }, replaceSelection: function (a, b, c) {
            for (var d = [], e = 0; e < this.sel.ranges.length; e++)d[e] = a;
            this.replaceSelections(d, b, c || "+input")
        }, replaceSelections: N(function (a, b, c) {
            for (var d = [], e = this.sel, f = 0; f < e.ranges.length; f++) {
                var g = e.ranges[f];
                d[f] = {from: g.from(), to: g.to(), text: sa(a[f]), origin: c}
            }
            if (f = b && "end" != b) {
                f = [];
                c = a = r(this.first, 0);
                for (e = 0; e < d.length; e++) {
                    var h = d[e], g = Ee(h.from, a, c), k =
                        Ee(ta(h), a, c);
                    a = h.to;
                    c = k;
                    "around" == b ? (h = this.sel.ranges[e], h = 0 > y(h.head, h.anchor), f[e] = new z(h ? k : g, h ? g : k)) : f[e] = new z(g, g)
                }
                f = new la(f, this.sel.primIndex)
            }
            b = f;
            for (f = d.length - 1; 0 <= f; f--)Oa(this, d[f]);
            b ? be(this, b) : this.cm && Pa(this.cm)
        }), undo: N(function () {
            kc(this, "undo")
        }), redo: N(function () {
            kc(this, "redo")
        }), undoSelection: N(function () {
            kc(this, "undo", !0)
        }), redoSelection: N(function () {
            kc(this, "redo", !0)
        }), setExtending: function (a) {
            this.extend = a
        }, getExtending: function () {
            return this.extend
        }, historySize: function () {
            for (var a =
                this.history, b = 0, c = 0, d = 0; d < a.done.length; d++)a.done[d].ranges || ++b;
            for (d = 0; d < a.undone.length; d++)a.undone[d].ranges || ++c;
            return {undo: b, redo: c}
        }, clearHistory: function () {
            this.history = new uc(this.history.maxGeneration)
        }, markClean: function () {
            this.cleanGeneration = this.changeGeneration(!0)
        }, changeGeneration: function (a) {
            a && (this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null);
            return this.history.generation
        }, isClean: function (a) {
            return this.history.generation == (a || this.cleanGeneration)
        },
        getHistory: function () {
            return {done: Xa(this.history.done), undone: Xa(this.history.undone)}
        }, setHistory: function (a) {
            var b = this.history = new uc(this.history.maxGeneration);
            b.done = Xa(a.done.slice(0), null, !0);
            b.undone = Xa(a.undone.slice(0), null, !0)
        }, addLineClass: N(function (a, b, c) {
            return nc(this, a, "gutter" == b ? "gutter" : "class", function (a) {
                var e = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass";
                if (a[e]) {
                    if (Fb(c).test(a[e]))return !1;
                    a[e] += " " + c
                } else a[e] = c;
                return !0
            })
        }), removeLineClass: N(function (a,
                                         b, c) {
            return nc(this, a, "gutter" == b ? "gutter" : "class", function (a) {
                var e = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass", f = a[e];
                if (f)if (null == c)a[e] = null; else {
                    var g = f.match(Fb(c));
                    if (!g)return !1;
                    var h = g.index + g[0].length;
                    a[e] = f.slice(0, g.index) + (g.index && h != f.length ? " " : "") + f.slice(h) || null
                } else return !1;
                return !0
            })
        }), addLineWidget: N(function (a, b, c) {
            return $f(this, a, b, c)
        }), removeLineWidget: function (a) {
            a.clear()
        }, markText: function (a, b, c) {
            return Wa(this, w(this, a), w(this,
                b), c, "range")
        }, setBookmark: function (a, b) {
            var c = {
                replacedWith: b && (null == b.nodeType ? b.widget : b),
                insertLeft: b && b.insertLeft,
                clearWhenEmpty: !1,
                shared: b && b.shared,
                handleMouseEvents: b && b.handleMouseEvents
            };
            a = w(this, a);
            return Wa(this, a, a, c, "bookmark")
        }, findMarksAt: function (a) {
            a = w(this, a);
            var b = [], c = u(this, a.line).markedSpans;
            if (c)for (var d = 0; d < c.length; ++d) {
                var e = c[d];
                (null == e.from || e.from <= a.ch) && (null == e.to || e.to >= a.ch) && b.push(e.marker.parent || e.marker)
            }
            return b
        }, findMarks: function (a, b, c) {
            a = w(this, a);
            b = w(this, b);
            var d = [], e = a.line;
            this.iter(a.line, b.line + 1, function (f) {
                if (f = f.markedSpans)for (var g = 0; g < f.length; g++) {
                    var h = f[g];
                    e == a.line && a.ch > h.to || null == h.from && e != a.line || e == b.line && h.from > b.ch || c && !c(h.marker) || d.push(h.marker.parent || h.marker)
                }
                ++e
            });
            return d
        }, getAllMarks: function () {
            var a = [];
            this.iter(function (b) {
                if (b = b.markedSpans)for (var c = 0; c < b.length; ++c)null != b[c].from && a.push(b[c].marker)
            });
            return a
        }, posFromIndex: function (a) {
            var b, c = this.first;
            this.iter(function (d) {
                d = d.text.length + 1;
                if (d >
                    a)return b = a, !0;
                a -= d;
                ++c
            });
            return w(this, r(c, b))
        }, indexFromPos: function (a) {
            a = w(this, a);
            var b = a.ch;
            if (a.line < this.first || 0 > a.ch)return 0;
            this.iter(this.first, a.line, function (a) {
                b += a.text.length + 1
            });
            return b
        }, copy: function (a) {
            var b = new P(xd(this, this.first, this.first + this.size), this.modeOption, this.first);
            b.scrollTop = this.scrollTop;
            b.scrollLeft = this.scrollLeft;
            b.sel = this.sel;
            b.extend = !1;
            a && (b.history.undoDepth = this.history.undoDepth, b.setHistory(this.getHistory()));
            return b
        }, linkedDoc: function (a) {
            a ||
            (a = {});
            var b = this.first, c = this.first + this.size;
            null != a.from && a.from > b && (b = a.from);
            null != a.to && a.to < c && (c = a.to);
            b = new P(xd(this, b, c), a.mode || this.modeOption, b);
            a.sharedHist && (b.history = this.history);
            (this.linked || (this.linked = [])).push({doc: b, sharedHist: a.sharedHist});
            b.linked = [{doc: this, isParent: !0, sharedHist: a.sharedHist}];
            a = Re(this);
            for (c = 0; c < a.length; c++) {
                var d = a[c], e = d.find(), f = b.clipPos(e.from), e = b.clipPos(e.to);
                y(f, e) && (f = Wa(b, f, e, d.primary, d.primary.type), d.markers.push(f), f.parent = d)
            }
            return b
        },
        unlinkDoc: function (a) {
            a instanceof q && (a = a.doc);
            if (this.linked)for (var b = 0; b < this.linked.length; ++b)if (this.linked[b].doc == a) {
                this.linked.splice(b, 1);
                a.unlinkDoc(this);
                Yf(Re(this));
                break
            }
            if (a.history == this.history) {
                var c = [a.id];
                Ga(a, function (a) {
                    c.push(a.id)
                }, !0);
                a.history = new uc(null);
                a.history.done = Xa(this.history.done, c);
                a.history.undone = Xa(this.history.undone, c)
            }
        }, iterLinkedDocs: function (a) {
            Ga(this, a)
        }, getMode: function () {
            return this.mode
        }, getEditor: function () {
            return this.cm
        }
    });
    P.prototype.eachLine =
        P.prototype.iter;
    var pg = ["iter", "insert", "remove", "copy", "getEditor"], Jb;
    for (Jb in P.prototype)P.prototype.hasOwnProperty(Jb) && 0 > D(pg, Jb) && (q.prototype[Jb] = function (a) {
        return function () {
            return a.apply(this.doc, arguments)
        }
    }(P.prototype[Jb]));
    Ya(P);
    var O = q.e_preventDefault = function (a) {
        a.preventDefault ? a.preventDefault() : a.returnValue = !1
    }, qg = q.e_stopPropagation = function (a) {
        a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0
    }, jd = q.e_stop = function (a) {
        O(a);
        qg(a)
    }, v = q.on = function (a, b, c) {
        a.addEventListener ?
            a.addEventListener(b, c, !1) : a.attachEvent ? a.attachEvent("on" + b, c) : (a = a._handlers || (a._handlers = {}), (a[b] || (a[b] = [])).push(c))
    }, ka = q.off = function (a, b, c) {
        if (a.removeEventListener)a.removeEventListener(b, c, !1); else if (a.detachEvent)a.detachEvent("on" + b, c); else if (a = a._handlers && a._handlers[b])for (b = 0; b < a.length; ++b)if (a[b] == c) {
            a.splice(b, 1);
            break
        }
    }, K = q.signal = function (a, b) {
        var c = a._handlers && a._handlers[b];
        if (c)for (var d = Array.prototype.slice.call(arguments, 2), e = 0; e < c.length; ++e)c[e].apply(null, d)
    }, Db =
        null, Hd = 30, Ae = q.Pass = {
        toString: function () {
            return "CodeMirror.Pass"
        }
    }, ha = {scroll: !1}, kd = {origin: "*mouse"}, Gb = {origin: "+move"};
    bb.prototype.set = function (a, b) {
        clearTimeout(this.id);
        this.id = setTimeout(b, a)
    };
    var aa = q.countColumn = function (a, b, c, d, e) {
        null == b && (b = a.search(/[^\s\u00a0]/), -1 == b && (b = a.length));
        d = d || 0;
        for (e = e || 0; ;) {
            var f = a.indexOf("\t", d);
            if (0 > f || f >= b)return e + (b - d);
            e += f - d;
            e += c - e % c;
            d = f + 1
        }
    }, vc = [""], Za = function (a) {
        a.select()
    };
    Qa ? Za = function (a) {
        a.selectionStart = 0;
        a.selectionEnd = a.value.length
    } : B &&
    (Za = function (a) {
        try {
            a.select()
        } catch (b) {
        }
    });
    var rg = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/, gf = q.isWordChar = function (a) {
            return /\w/.test(a) || "" < a && (a.toUpperCase() != a.toLowerCase() || rg.test(a))
        }, ig = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,
        Ea;
    Ea = document.createRange ? function (a, b, c, d) {
        var e = document.createRange();
        e.setEnd(d || a, c);
        e.setStart(a, b);
        return e
    } : function (a, b, c) {
        var d = document.body.createTextRange();
        try {
            d.moveToElementText(a.parentNode)
        } catch (e) {
            return d
        }
        d.collapse(!0);
        d.moveEnd("character", c);
        d.moveStart("character", b);
        return d
    };
    var Wc = q.contains = function (a, b) {
        3 == b.nodeType && (b = b.parentNode);
        if (a.contains)return a.contains(b);
        do if (11 == b.nodeType && (b = b.host), b == a)return !0; while (b = b.parentNode)
    };
    B && 11 > C && (fa = function () {
        try {
            return document.activeElement
        } catch (a) {
            return document.body
        }
    });
    var kb = q.rmClass = function (a, b) {
            var c = a.className, d = Fb(b).exec(c);
            if (d) {
                var e = c.slice(d.index + d[0].length);
                a.className = c.slice(0, d.index) + (e ? d[1] + e : "")
            }
        }, mb = q.addClass = function (a, b) {
            var c = a.className;
            Fb(b).test(c) || (a.className += (c ? " " : "") + b)
        }, Dd = !1, Lf = function () {
            if (B && 9 > C)return !1;
            var a = t("div");
            return "draggable"in a || "dragDrop"in a
        }(), yd, vd, sa = q.splitLines = 3 != "\n\nb".split(/\n/).length ? function (a) {
            for (var b = 0, c = [], d = a.length; b <= d;) {
                var e = a.indexOf("\n", b);
                -1 == e && (e = a.length);
                var f = a.slice(b, "\r" ==
                a.charAt(e - 1) ? e - 1 : e), g = f.indexOf("\r");
                -1 != g ? (c.push(f.slice(0, g)), b += g + 1) : (c.push(f), b = e + 1)
            }
            return c
        } : function (a) {
            return a.split(/\r\n?|\n/)
        }, ng = window.getSelection ? function (a) {
            try {
                return a.selectionStart != a.selectionEnd
            } catch (b) {
                return !1
            }
        } : function (a) {
            try {
                var b = a.ownerDocument.selection.createRange()
            } catch (c) {
            }
            return b && b.parentElement() == a ? 0 != b.compareEndPoints("StartToEnd", b) : !1
        }, Ce = function () {
            var a = t("div");
            if ("oncopy"in a)return !0;
            a.setAttribute("oncopy", "return;");
            return "function" == typeof a.oncopy
        }(),
        bd = null, va = {
            3: "Enter",
            8: "Backspace",
            9: "Tab",
            13: "Enter",
            16: "Shift",
            17: "Ctrl",
            18: "Alt",
            19: "Pause",
            20: "CapsLock",
            27: "Esc",
            32: "Space",
            33: "PageUp",
            34: "PageDown",
            35: "End",
            36: "Home",
            37: "Left",
            38: "Up",
            39: "Right",
            40: "Down",
            44: "PrintScrn",
            45: "Insert",
            46: "Delete",
            59: ";",
            61: "\x3d",
            91: "Mod",
            92: "Mod",
            93: "Mod",
            107: "\x3d",
            109: "-",
            127: "Delete",
            173: "-",
            186: ";",
            187: "\x3d",
            188: ",",
            189: "-",
            190: ".",
            191: "/",
            192: "`",
            219: "[",
            220: "\\",
            221: "]",
            222: "'",
            63232: "Up",
            63233: "Down",
            63234: "Left",
            63235: "Right",
            63272: "Delete",
            63273: "Home",
            63275: "End",
            63276: "PageUp",
            63277: "PageDown",
            63302: "Insert"
        };
    q.keyNames = va;
    (function () {
        for (var a = 0; 10 > a; a++)va[a + 48] = va[a + 96] = String(a);
        for (a = 65; 90 >= a; a++)va[a] = String.fromCharCode(a);
        for (a = 1; 12 >= a; a++)va[a + 111] = va[a + 63235] = "F" + a
    })();
    var vb, gg = function () {
        function a(a) {
            return 247 >= a ? "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN".charAt(a) :
                1424 <= a && 1524 >= a ? "R" : 1536 <= a && 1773 >= a ? "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm".charAt(a - 1536) : 1774 <= a && 2220 >= a ? "r" : 8192 <= a && 8203 >= a ? "w" : 8204 == a ? "b" : "L"
        }

        function b(a, b, c) {
            this.level = a;
            this.from = b;
            this.to = c
        }

        var c = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/, d = /[stwN]/, e = /[LRr]/, f = /[Lb1n]/, g = /[1n]/;
        return function (h) {
            if (!c.test(h))return !1;
            for (var k = h.length, l = [], m = 0, p; m < k; ++m)l.push(a(h.charCodeAt(m)));
            for (var m = 0, n = "L"; m < k; ++m)p = l[m], "m" == p ? l[m] = n : n = p;
            m = 0;
            for (n = "L"; m < k; ++m)p = l[m], "1" == p && "r" == n ? l[m] = "n" : e.test(p) && (n = p, "r" == p && (l[m] = "R"));
            m = 1;
            for (n = l[0]; m < k - 1; ++m)p = l[m], "+" == p && "1" == n && "1" == l[m + 1] ? l[m] = "1" : "," != p || n != l[m + 1] || "1" != n && "n" != n || (l[m] = n), n = p;
            for (m = 0; m < k; ++m)if (p = l[m], "," == p)l[m] = "N"; else if ("%" == p) {
                for (n = m + 1; n < k && "%" == l[n]; ++n);
                var q = m && "!" == l[m - 1] || n < k && "1" == l[n] ? "1" : "N";
                for (p = m; p < n; ++p)l[p] = q;
                m = n - 1
            }
            m = 0;
            for (n = "L"; m < k; ++m)p =
                l[m], "L" == n && "1" == p ? l[m] = "L" : e.test(p) && (n = p);
            for (m = 0; m < k; ++m)if (d.test(l[m])) {
                for (n = m + 1; n < k && d.test(l[n]); ++n);
                p = "L" == (n < k ? l[n] : "L");
                q = "L" == (m ? l[m - 1] : "L") || p ? "L" : "R";
                for (p = m; p < n; ++p)l[p] = q;
                m = n - 1
            }
            for (var n = [], r, m = 0; m < k;)if (f.test(l[m])) {
                p = m;
                for (++m; m < k && f.test(l[m]); ++m);
                n.push(new b(0, p, m))
            } else {
                var t = m, q = n.length;
                for (++m; m < k && "L" != l[m]; ++m);
                for (p = t; p < m;)if (g.test(l[p])) {
                    t < p && n.splice(q, 0, new b(1, t, p));
                    t = p;
                    for (++p; p < m && g.test(l[p]); ++p);
                    n.splice(q, 0, new b(2, t, p));
                    t = p
                } else++p;
                t < m && n.splice(q, 0, new b(1,
                    t, m))
            }
            1 == n[0].level && (r = h.match(/^\s+/)) && (n[0].from = r[0].length, n.unshift(new b(0, 0, r[0].length)));
            1 == A(n).level && (r = h.match(/\s+$/)) && (A(n).to -= r[0].length, n.push(new b(0, k - r[0].length, k)));
            2 == n[0].level && n.unshift(new b(1, n[0].to, n[0].to));
            n[0].level != A(n).level && n.push(new b(n[0].level, k, k));
            return n
        }
    }();
    q.version = "5.2.0";
    return q
});